🔥 使用 httputils + sbe 实现金融级 java rpc
1、认识 Simple Binary Encoding (sbe)
高性能Java库 Agrona 的主要目标是减少性能瓶颈,通过提供线程安全的直接和原子缓冲区、无装箱操作的原始类型列表、开散列映射和集合以及锁-free队列等,为开发者在处理并发和低延迟场景时提供强大工具。
Simple Binary Encoding (sbe) 是 Agrona 的一部分,也是高性能通讯框架 Aeron 的一部分。
2、什么是 rpc ?
一讲 rpc ,很多人会想到 dubbo (国产)和 grpc。估计还会联想到注册与发现服务;可能还会联想到微服务。可能就会觉得这个事儿“老重啦”,害怕!
其实很简单的,你请求一次 http 就是个 rpc 请求了(远程过程调用嘛)。最典型的就是 http + json 请求了。
3、现在讲 httputils + sbe
这里我们会用到两个重要的 solon 框架的插件:一个是 httputils 工具插件,一个是 abc + agrona 序列化插件(abc 适配了多个编解码方案)。
<!-- 这是 sbe 的编解码包装器 --> <dependency> <groupId>org.noear</groupId> <artifactId>solon-serialization-abc</artifactId> </dependency> <dependency> <groupId>org.agrona</groupId> <artifactId>agrona</artifactId> <version>${agrona-sbe.version}</version> </dependency> <dependency> <groupId>org.noear</groupId> <artifactId>solon-net-httputils</artifactId> </dependency>
这里要感谢 solon 框架,它强调三元合一(mvc 与 rpc 是自然一体的)。下面,开始干活啦...
- 公用包(也可以在客户端,服务端分别定义实体类。只要实现 SbeSerializable 接口即可 )
这里定义一个 sbe 实体类。注意要实现 SbeSerializable 接口。
@Getter @Setter public class MessageDo implements SbeSerializable { private long id; private String title; @Override public void serializeRead(SbeInput in) { id = in.readLong(); title = in.readString(); } @Override public void serializeWrite(SbeOutput out) { out.writeLong(id); out.writeString(title); } }
- 服务端(只支持 @Body 数据接收,只支持实体类)
在 solon web 项目里,添加一个控制器(注解可以用 @Remoting
或 @Controller
)。使用 @Remoting
时,方法上不需要加 @Mapping
注解。
#添加插件 org.noear:solon-web org.noear:solon-serialization-abc org.agrona:agrona:${agrona-sbe.version} # 提供 sbe 序列化支持
@Mapping("/rpc/demo") @Remoting public class HelloServiceImpl { @Override public MessageDo hello(@Body MessageDo message) { //还可接收路径变量,与请求上下文 return message; } }
- 客户端应用 for HttpUtils(只支持 body 数据提交,只支持实体类)
#添加插件 org.noear:solon-net-httputils org.noear:solon-serialization-abc org.agrona:agrona:${agrona-sbe.version} # 提供 sbe 序列化支持
//应用代码 @Component public class DemoCom { public MessageDo hello() { MessageDo message = new MessageDo(); message.setId(3); //指明请求数据为 ABC,接收数据要 ABC return 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) org.agrona:agrona:${agrona-sbe.version} # 提供 sbe 序列化支持
- 代码应用(只支持 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); } }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Fish Shell 分享从 C++ 切换到 Rust 的经验
本月初,Fish Shell 4.0 进入测试阶段,C++ 代码被移植到了 Rust。现在,Fish Shell 的大部分代码都过渡到了 Rust,项目团队在日前发布了一篇博文,概述了他们在将庞大的 C++ 代码库移植到 Rust 的过程中取得的成功和遇到的挑战。 Fish Shell 开发人员指出,他们在使用 C++ 时遇到的一些问题导致他们更倾向于探索其他语言,其中包括工具和编译器/平台差异、人体工程学和线程安全以及开发社区。其中一个例子是,Fish 曾用 C++ 制作过真正的多线程执行原型,但这对这个开源 Shell 而言是非常痛苦的。 至于 Rust 编程语言,他们承认:"Rust 很酷。它很有趣"。并赞赏了 Rust 的工具性、简单的工具设置、出色的人体工学以及更好的依赖性管理,且 Rust 的发送和同步能力也使其非常适合线程。 但使用 Rust 的过程中也面临了一些挑战,例如如何处理可移植性、工具有时未能考虑其他目标以及一些本地化问题等。总的来说: “移植并非一帆风顺,而且并非一切都按计划进行。但总体而言,进展相当顺利。我们现在有了一个我们非常喜欢的代码库,它已经获得了一些...
- 下一篇
谷歌 CEO:Gemini 将成为公司 2025 年“最大重点”
CNBC 消息称,谷歌 CEO 桑达尔·皮查伊 (Sundar Pichai) 在 12 月 18 日的战略会议上指出,2025 年“风险很高”。因为公司面临着更激烈的竞争和监管障碍,并且要应对 AI 领域的快速发展。 “我认为 2025 年将至关重要。我认为我们必须意识到这一刻的紧迫性,作为一家公司,我们需要加快步伐。风险很高。这是颠覆性的时刻。在 2025 年,我们需要坚持不懈地专注于释放这项技术的优势并解决真正的用户问题。” 谷歌等科技公司目前都在大力投资 AI,但结好坏参半。皮查伊表示,“打造大型新业务”是当务之急。其中就包括 Gemini 应用程序,该公司高管们认为,这是谷歌下一个能覆盖 5 亿用户的应用程序。 皮查伊补充道,“Gemini 应用程序发展势头强劲,尤其是过去几个月。但我们在 2025 年还需要做一些工作来缩小差距并确立领导地位。明年,扩大 Gemini 在消费者方面的规模将是我们最大的关注点。”
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6