当前位置: 首页 > news >正文

使用 httputils + chronicle-bytes 实现金融级 java rpc

1、认识 chronicle-bytes

Chronicle-Bytes 是一个类似于 Java NIO 的 ByteBuffer 的高效字节操作库,但它提供了许多扩展功能。这个项目由 OpenHFT 开发并维护,旨在提供高性能、低延迟的数据处理解决方案。Chronicle-Bytes 设计用于高频率交易和其他对性能有极端要求的场景,它支持序列化和反序列化多种数据类型,同时保持内存的高效利用。

2、了解下 rpc ?

一讲 rpc ,很多人会想到 dubbo (国产)和 grpc。估计还会联想到注册与发现服务;可能还会联想到微服务。可能就会觉得这个事儿“老重啦”,害怕!

其实很简单的,你请求一次 http 就是个 rpc 请求了(远程过程调用嘛)。最典型的就是 http + json 请求了。

3、现在讲 httputils + chronicle-bytes

这里我们会用到两个重要的 solon 框架的插件:一个是 abc 序列化插件(abc 适配了多个编解码方案,其中有 chronicle-bytes),一个是 httputils 工具插件。

<!-- 这是 chronicle-bytes 的编解码包装器 -->
<dependency><groupId>org.noear</groupId><artifactId>solon-serialization-abc</artifactId>
</dependency><dependency><groupId>net.openhft</groupId><artifactId>chronicle-bytes</artifactId><version>${chronicle-bytes.version}</version>
</dependency><dependency><groupId>org.noear</groupId><artifactId>solon-net-httputils</artifactId>
</dependency>

这里要感谢 solon 框架,它强调三元合一(mvc 与 rpc 是自然一体的)。下面,开始干活啦…

  • 公用包(也可以在客户端,服务端分别定义实体类。只要实现 ChrBytesSerializable 接口即可 )

这里定义一个 chronicle-bytes 实体类。注意要实现 ChrBytesSerializable 接口。

@Getter
@Setter
public class MessageDo implements ChrBytesSerializable {private long id;private String title;@Overridepublic void serializeRead(BytesIn in) {id = in.readLong();title = in.readUtf8();}@Overridepublic void serializeWrite(BytesOut out) {out.writeLong(id);out.writeUtf8(title);}
}
  • 服务端(只支持 @Body 数据接收,只支持实体类)

在 solon web 项目里,添加一个控制器(注解可以用 @Remoting@Controller)。使用 @Remoting 时,方法上不需要加 @Mapping 注解。

#添加插件
org.noear:solon-web
org.noear:solon-serialization-abc
net.openhft:chronicle-bytes:${chronicle-bytes.version} # 提供 chronicle-bytes 序列化支持
@Mapping("/rpc/demo")
@Remoting
public class HelloServiceImpl  implements HelloService {@Overridepublic MessageDo hello(@Body MessageDo message) { //还可接收路径变量,与请求上下文return message;}
}
  • 客户端应用 for HttpUtils(只支持 body 数据提交,只支持实体类)
#添加插件
org.noear:solon-net-httputils
org.noear:solon-serialization-abc
net.openhft:chronicle-bytes:${chronicle-bytes.version} # 提供 chronicle-bytes 序列化支持
//应用代码
@Component
public class DemoCom {public MessageDo hello() {MessageDo message = new MessageDo();message.setId(3);//指明请求数据为 ABC,接收数据要 ABCreturn HttpUtils.http("http://localhost:8080/rpc/demo/hello").serializer(AbcBytesSerializer.getInstance()).header(ContentTypes.HEADER_CONTENT_TYPE, ContentTypes.ABC_VALUE).header(ContentTypes.HEADER_ACCEPT, ContentTypes.ABC_VALUE).bodyOfBean(message).postAs(MessageDo.class);}
}

4、总结

总体上,跟 json 没什么大的区别。主要是指定了:序列化器、内容类型、接收类型,让各端能识别类据类型。

5、还可以使用“注解式 http 客户端”框架

肯定也会有人觉得,一个接口还好,如果有很多接口就要写很多重复的http请求代码了。所以,“注解式 http 客户端” 很重要,这也是很多 rpc 框架流行的原因,就像调用本地接口一样,使用远程接口。

nami 是 solon 框架的 rpc 客户端(或者,注解式 http 客户端),支持各种序列化。(只要是“支持序列化定制”的注解式 http 客户端,都可用!)

  • 添加两个依赖包
#添加插件
org.noear:nami-coder-abc # abc 编解码支持
org.noear:nami-channel-http     # http 请求通道支持,也可以是 socketd(支持 tcp, udp, ws)
net.openhft:chronicle-bytes:${chronicle-bytes.version} # 提供 chronicle-bytes 序列化支持
  • 代码应用(只支持 body 数据提交,只支持实体类)
@NamiClient(url = "http://localhost:8080/rpc/demo", headers = {ContentTypes.ABC, ContentTypes.ABC_ACCEPT})
public interface HelloService {MessageDo hello(@NamiBody MessageDo message);//方法2//方法3//方法4//方法5//方法6
}@Component
public class DemoCom {@NamiClient //注入HelloService helloService;public MessageDo hello() {MessageDo message = new MessageDo();message.setId(3);rerturn helloService.hello(message);}
}
http://www.lryc.cn/news/514944.html

相关文章:

  • 软件工程期末复习(一)
  • element ui 组件 时间选择器出现转换问题的解决办法
  • 报错:websocket注入为null,已解决!
  • .e01, ..., .e0n的分卷压缩包怎么解压
  • 四年前的计划,青涩但坚韧
  • 【人工智能】人工智能与大模型
  • 小波与傅里叶变换在去噪效果上的对比分析-附Matlab源程序
  • Luma AI 简单几步生成视频
  • AfuseKt1.4.4 | 刮削视频播放器,支持阿里云盘和自动海报墙
  • 深入理解计算机中的补码、反码、原码
  • Scratch教学作品 | 白水急流——急流勇进,挑战反应极限! ‍♂️
  • Px4 V2.4.8飞控Mavlink命令控制说明
  • Linux(Ubuntu24.04)源码编译安装VTK7.1.1记录
  • 【Go学习】-01-4-项目管理及协程
  • ES_如何设置ElasticSearch 8.0版本的匿名访问以及https_http模式的互相切换
  • PySide6 SQLite3 做的 电脑组装报价系统
  • 逻辑回归(Logistic Regression) —— 机器学习中的经典分类算法
  • 【数据库系统概论】数据库完整性与触发器--复习
  • 【机器学习:一、机器学习简介】
  • 网关的主要类型和它们的特点
  • NDA:Non-Disclosure Agreement
  • 方正畅享全媒体新闻采编系统 imageProxy.do 任意文件读取漏洞复现(附脚本)
  • OpenHarmony通过挂载镜像来修改镜像内容,RK3566鸿蒙开发板演示
  • 代理模式和适配器模式有什么区别
  • 2025年度全国会计专业技术资格考试 (甘肃考区)报名公告
  • ansible-playbook 搭建JDK
  • 数据结构(ing)
  • 杰盛微 JSM4056 1000mA单节锂电池充电器芯片 ESOP8封装
  • webpack5基础(上篇)
  • 快速理解MIMO技术