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

news/2025/1/8 18:09:44/

1、认识 chronicle-bytes

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

rpc__5">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 接口。

java">@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 序列化支持
java">@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 序列化支持
java">//应用代码
@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 数据提交,只支持实体类)
java">@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.ppmy.cn/news/1561340.html

相关文章

使用systemd管理MySQL服务器

如果您在以下Linux平台上使用RPM或Debian软件包安装MySQL&#xff0c;则服务器启动和关闭由systemd管理&#xff1a; 1、RPM 包平台 企业Linux版本7及更高版本 SUSELinuxEnterprise Server 12及更高版本 Fedora 29及更高版本 2、Debian家族平台 Debian平台 Ubuntu平台 如果…

AWS EMR基础知识

EMR Overview 知识点&#xff1a;EMR是可简化大数据框架运行的托管集群平台&#xff0c;能以可扩展且具成本效益的方式处理和分析大量数据&#xff0c;应用于大数据分析、数据处理、机器学习、数据湖和数据仓库等场景。注意事项&#xff1a;根据业务需求选择合适的使用场景&am…

快速排序(霍尔法),冒泡排序 【C语言】

冒泡排序 效率低&#xff0c;但是稳定性高 代码 // 冒泡排序 void maopao(int a[]);int main() {int a1[10] {34,78,29,46,12,85,63,92,57,31};printf("\n排序前:\n");print(a1);maopao(a2);printf("冒泡排序后:");print(a2); }//冒泡排序 void maopao(…

Kubernetes容器设计模式

Kubernetes容器设计模式 在容器编排领域&#xff0c;Kubernetes已经成为事实上的标准&#xff0c;为容器化应用程序提供了可靠且可扩展的平台。构建容器化应用与传统应用有着显著差异&#xff0c;因此理解和使用容器设计模式至关重要。本文将探讨Kubernetes中的容器设计模式&a…

SUB输入5V升压充电16.8V芯片HU5912

HU5912芯片&#xff0c;作为航誉微电子有限公司推出的一款高性能升压充电管理IC&#xff0c;自其面世以来&#xff0c;便以其出色的性能和广泛的应用领域&#xff0c;受到了业界的高度关注和赞誉。本文将详细介绍HU5912芯片的技术特点、应用优势、市场定位以及其在各类电子设备…

mysql删除无用用户

1、删除不用的账户 (1) 查看当前已存在账户 mysql> select user,host,password from mysql.user; 或下面的命令 #mysql> sELECT DISTINCT CONCAT(User: ,user,,host,;) AS query FROM mysql.user; --------------------------------------- | query …

MacBook_Xcode_Swift雨燕

Swift Swift Swift Swift是苹果公司开发的现代化编程语言&#xff0c; 专为Apple平台设计。其简洁语法、类型安全、Optionals处理、Playgrounds交互式环境、泛型编程、协议与扩展、闭包功能、枚举与关联值、结构体与类的高效内存管理、异步编程的async/await语法、Swift Packa…

第4章:MongoDB索引

第4章&#xff1a;MongoDB索引 4.1 索引基础 4.1.1 索引的重要性 提高查询性能减少集合扫描支持高效排序 4.1.2 默认索引 // _id字段的默认索引 {"_id": ObjectId("..."),"name": "示例文档" }4.2 索引类型 4.2.1 单字段索引 /…