当前位置: 首页 > 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);}
}

相关文章:

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

1、认识 chronicle-bytes Chronicle-Bytes 是一个类似于 Java NIO 的 ByteBuffer 的高效字节操作库&#xff0c;但它提供了许多扩展功能。这个项目由 OpenHFT 开发并维护&#xff0c;旨在提供高性能、低延迟的数据处理解决方案。Chronicle-Bytes 设计用于高频率交易和其他对性…...

软件工程期末复习(一)

题目复习 单选题 软件产品的核心特性是什么&#xff1f; A. 物质性 B. 逻辑性 C. 可复制性 D. 消耗性 正确答案&#xff1a;B 单选题 在软件开发过程中&#xff0c;哪个环节最接近于传统制造业中的“生产”过程&#xff1f; A. 需求分析 B. 编码 C. 测试 D. 研制&#xff08…...

element ui 组件 时间选择器出现转换问题的解决办法

在使用时间选择器添加数据是会出现转换失败问题 vue中代码为&#xff1a; 解决办法&#xff1a; 在el-date-picker中添加 format 和 value-format...

报错:websocket注入为null,已解决!

错误截图 原因分析&#xff1a; WebSocket 在 Spring 框架中的注入问题是由其生命周期与 Spring 容器的作用域不一致引起的。spring管理的都是单例&#xff08;singleton&#xff09;&#xff0c;和 websocket &#xff08;多对象&#xff09;相冲突。如果你的WebSocket 处理类…...

.e01, ..., .e0n的分卷压缩包怎么解压

用BandiZip&#xff0c;这些分卷压缩中还有一个.exe的文件&#xff0c;这个不是可执行文件&#xff0c;是一个解压缩的开头。 安装好bandiZip后&#xff0c;右键这个.exe文件 点击打开就是开始解压了&#xff1a; 最后解压后是这些。然后一个个再次解压....

四年前的计划,青涩但坚韧

回看四年前写的目标&#xff0c;做的计划&#xff0c;特别感慨&#xff0c;当时的我无法想到现在正在做的事情。 一个契机&#xff0c;群里有个朋友说在写五年规划&#xff0c;让我想到五年前刚毕业不久也写过类似的东西&#xff0c;当时写的是三年学习计划&#xff0c;那是202…...

【人工智能】人工智能与大模型

人工智能与大模型的结合正在深刻改变多个行业和领域的格局。 1. 人工智能 (AI) 人工智能指的是使计算机或机器具备模拟人类智能的能力&#xff0c;包括学习、推理、问题解决、自然语言处理、视觉感知等。AI的发展可以分为几个阶段&#xff1a; 弱人工智能 (Narrow AI)&#…...

小波与傅里叶变换在去噪效果上的对比分析-附Matlab源程序

&#x1f468;‍&#x1f393; 博主简介&#xff1a;博士研究生 &#x1f52c; 超级学长&#xff1a;超级学长实验室&#xff08;提供各种程序开发、实验复现与论文指导&#xff09; &#x1f4e7; 个人邮箱&#xff1a;easy_optics126.com &#x1f56e; 目 录 摘要一、…...

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站&#xff0c;按照下图所示即可生成高质量的视频&#xff0c;同时&#xff0c;我们也提供了简单易用的 API 方便集成调用&#xff0c;可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术&#xff0c;实现了上面的图…...

AfuseKt1.4.4 | 刮削视频播放器,支持阿里云盘和自动海报墙

AfuseKt是一款功能强大的安卓端在线视频播放器&#xff0c;广泛兼容多种平台如阿里云盘、Alist、WebDAV、Emby、Jellyfin等&#xff0c;同时也支持本地存储视频文件的播放。其特色功能包括自动抓取影片信息生成海报墙展示&#xff0c;充分利用设备硬件进行高清视频流畅播放&…...

深入理解计算机中的补码、反码、原码

问题&#xff1a; 我们每天用的钟表&#xff0c;其实只有1~12这12个数字&#xff0c;但我们日常会说13点、17点之类的。 问&#xff1a;13点在钟表上哪个位置&#xff1f; 答&#xff1a;很简单嘛&#xff0c;1点的位置。 你不觉得奇怪吗&#xff0c;为啥13点会和1点在同一个位…...

Scratch教学作品 | 白水急流——急流勇进,挑战反应极限! ‍♂️

今天为大家推荐一款刺激又好玩的Scratch冒险作品——《白水急流》&#xff01;由AgentFransidium制作&#xff0c;这款作品将带你体验惊险的急流救援任务&#xff0c;帮助那位“睡着的疯狂人”安全穿越湍急水域&#xff01;想要挑战自己的反应极限&#xff1f;快来试试吧&#…...

Px4 V2.4.8飞控Mavlink命令控制说明

首先&#xff0c;可以使用两种方法连接飞控&#xff0c;使用虚拟机&#xff08;LINUX&#xff09;或使用地面站&#xff08;QGC&#xff09;连接。 在px4的代码文件位置打开命令终端&#xff0c;输入连接命令&#xff1a; ./Tools/mavlink_shell.py 在控制台使用help来获取所有…...

Linux(Ubuntu24.04)源码编译安装VTK7.1.1记录

VTK&#xff08;Visualization Toolkit&#xff09;是一个开源的3D可视化开发工具包&#xff0c;用于开发可视化和图形处理应用程序。VTK提供了一系列的算法和工具&#xff0c;用于创建、渲染和处理复杂的3D图形和数据。VTK由C编写&#xff0c;并提供了Python、Java和Tcl等语言…...

【Go学习】-01-4-项目管理及协程

【Go学习】-01-4-项目管理及协程 1 项目管理1.1 包1.1.1 包的基本概念1.1.2 包的导入1.1.3 包的导入路径1.1.4 包的引用格式 1.2. go mod1.2.1 项目中使用 2 协程并发2.1 并发2.2 Goroutine2.2.1 使用2.2.2 GMP2.2.2.1 Golang “调度器” 的由来2.2.2.2 Go 语言的协程 goroutin…...

ES_如何设置ElasticSearch 8.0版本的匿名访问以及https_http模式的互相切换

总结&#xff1a; 设置匿名访问&#xff0c;只需要设置xpack.security.authc.anonymous.username和xpack.security.authc.anonymous.roles参数就行&#xff0c;设置好后&#xff0c;可以匿名访问也可以非匿名访问&#xff0c;但是非匿名访问的情况下必须保证用户名和密码正确 取…...

PySide6 SQLite3 做的 电脑组装报价系统

一、数据库结构说明 1. 配件类别表 (component_categories) 字段名类型说明约束category_idINTEGER类别IDPRIMARY KEY, AUTOINCREMENTcategory_nameTEXT类别名称NOT NULL, UNIQUEdescriptionTEXT类别描述 2. 配件表 (components) 字段名类型说明约束component_idINTEGER配件…...

逻辑回归(Logistic Regression) —— 机器学习中的经典分类算法

1. 逻辑回归简介 逻辑回归是一种线性分类模型&#xff0c;常用于二分类问题。它通过学习特征权重&#xff0c;将输入映射为0 到 1 之间的概率值&#xff0c;并根据阈值将样本归入某一类别。逻辑回归使用Sigmoid 函数将线性结果转化为概率。 尽管名字中有“回归”&#xff0c;…...

【数据库系统概论】数据库完整性与触发器--复习

在数据库系统概论中&#xff0c;数据库完整性是指确保数据库中数据的准确性、一致性和有效性的一组规则和约束。数据库完整性主要包括实体完整性、参照完整性和用户定义完整性。以下是详细的复习内容&#xff1a; 1. 数据库完整性概述 数据库完整性是指一组规则&#xff0c;这…...

【机器学习:一、机器学习简介】

机器学习是当前人工智能领域的重要分支&#xff0c;其目标是通过算法从数据中提取模式和知识&#xff0c;并进行预测或决策。以下从 机器学习概述、有监督学习 和 无监督学习 三个方面进行介绍。 机器学习概述 机器学习定义 机器学习&#xff08;Machine Learning&#xff0…...

网关的主要类型和它们的特点

网关&#xff0c;作为网络通信的关键节点&#xff0c;根据其应用场景和功能特点&#xff0c;可以分为多种类型。 1.协议网关 特点&#xff1a; • 协议转换&#xff1a;协议网关的核心功能是转换不同网络之间的通信协议。例如&#xff0c;它可以将IPv4协议的数据包转换为IPv6协…...

NDA:Non-Disclosure Agreement

NDA 是 Non-Disclosure Agreement 的缩写&#xff0c;中文通常翻译为“保密协议”或“非披露协议”。其含义是&#xff1a;在协议约束下&#xff0c;协议的签署方有义务对协议中规定的信息或内容保密&#xff0c;不能向协议之外的第三方披露。 通常&#xff0c;NDA适用于以下场…...

方正畅享全媒体新闻采编系统 imageProxy.do 任意文件读取漏洞复现(附脚本)

0x01 产品描述: 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、…...

OpenHarmony通过挂载镜像来修改镜像内容,RK3566鸿蒙开发板演示

在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容&#xff0c;修改源码再编译很费时。今天为大家介绍一个便捷的方法&#xff0c;让OpenHarmony通过挂载镜像来修改镜像内容&#xff01;触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器&#xff0c;树…...

代理模式和适配器模式有什么区别

代理模式&#xff08;Proxy Pattern&#xff09;和适配器模式&#xff08;Adapter Pattern&#xff09;是两种结构型设计模式&#xff0c;它们看似相似&#xff0c;但在设计意图、使用场景以及功能上有一些显著的区别。下面是它们的主要区别&#xff1a; 1. 目的与意图 代理模…...

2025年度全国会计专业技术资格考试 (甘肃考区)报名公告

2025年度全国会计专业技术资格考试 &#xff08;甘肃考区&#xff09;报名公告 按照财政部、人力资源和社会保障部统一安排&#xff0c;2025年度全国会计专业技术初级、中级、高级资格考试报名即将开始&#xff0c;现将甘肃考区有关事项通知如下&#xff1a; 一、报名条件 …...

ansible-playbook 搭建JDK

文件目录结构 main.yml #首先检测有无java&#xff0c;没有才会安装&#xff0c;有了就直接跳过 - name: Create installation directoryfile: path/var/www/ statedirectory- name: Check javashell: . /etc/profile && java -versionregister: resultignore_errors…...

数据结构(ing)

学习内容 指针 指针的定义&#xff1a; 指针是一种变量&#xff0c;它的值为另一个变量的地址&#xff0c;即内存地址。 指针在内存中也是要占据位置的。 指针类型&#xff1a; 指针的值用来存储内存地址&#xff0c;指针的类型表示该地址所指向的数据类型并告诉编译器如何解…...

杰盛微 JSM4056 1000mA单节锂电池充电器芯片 ESOP8封装

JSM4056 1000mA单节锂电池充电器芯片 JSM4056是一款单节锂离子电池恒流/恒压线性充电器&#xff0c;简单的外部应用电路非常适合便携式设备应用&#xff0c;适合USB电源和适配器电源工作&#xff0c;内部采用防倒充电路&#xff0c;不需要外部隔离二极管。热反馈可对充电电流进…...

webpack5基础(上篇)

一、基本配置 在开始使用 webpack 之前&#xff0c;我们需要对 webpack 的配置有一定的认识 1、5大核心概念 1&#xff09;entry &#xff08;入口&#xff09; 指示 webpack 从哪个文件开始打包 2&#xff09;output&#xff08;输出&#xff09; 制视 webpack 打包完的…...