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);
}
}

使用 httputils + sbe (Simple Binary Encoding) 实现金融级 java rpc的更多相关文章

  1. 基于Raft深度优化,腾讯云金融级消息队列CMQ高可靠算法详解

    背景介绍 分布式系统是指一组独立的计算机,通过网络协同工作的系统,客户端看来就如同单台机器在工作.随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式系统具有扩展性强 ...

  2. 阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路

    本文原始内容由作者“阳振坤”整理发布于OceanBase技术公众号. 1.引言 OceanBase 是蚂蚁金服自研的分布式数据库,在其 9 年的发展历程里,从艰难上线到找不到业务场景濒临解散,最后在双 ...

  3. 性能跃升50%!解密自主研发的金融级分布式关系数据库OceanBase 2.0

    小蚂蚁说: 相信大家对蚂蚁金服自主研发的金融级分布式关系数据库OceanBase的故事不再陌生了.在刚刚过去的2018年天猫双11中,成交额2135亿再次创造了新纪录,而支撑今年双11的支付宝核心链路 ...

  4. 为数据赋能:腾讯TDSQL分布式金融级数据库前沿技术

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 简介:李海翔,网名"那海蓝蓝",腾讯金融云数据库技术专家.中国人民大学信息学院工程硕士企业导师.著有<数据库事务处 ...

  5. 蚂蚁金服CTO程立:金融级分布式交易的技术路径

    总结: 强一致的微服务 oceanbase里面的投票选举以及多中心多地部署 单元化市异地多活的基础.支付宝是异地多活和容灾结合,而容灾的基础也是单元化.基于单元化进行单元的调度.部署.容灾. 混合云架 ...

  6. 华为云MySQL金融版正式商用,高可靠的金融级数据库来了

    摘要:全新三节点架构,基于深度优化的MGR组复制技术,提供金融级的数据一致性. 日前,华为云数据库MySQL 金融版正式商业化发布,MySQL金融版采用MGR技术,基于Paxos协议,采用一主两备三节 ...

  7. Kube-OVN:大型银行技术团队推荐的金融级云原生网络方案

    近日,由TWT社区主办的2021容器云职业技能大赛团队赛的冠军作品:<适用于大中型银行的云原生技术体系建设方案>中,Kube-OVN成为银行技术团队推荐的金融级云原生网络最佳实践.本文部分 ...

  8. ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)B Binary Encoding

    B: 现在有一种新的2进制表示法,要你求出0~m-1的每个数的表示. 规则如下:n 是满足 m<=2n 最小数. 而0~m-1的数只能够用n-1个位和n个位来表示. 对于n个位表示的数来说不能有 ...

  9. leetcode 124. Binary Tree Maximum Path Sum ----- java

    Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence ...

  10. leetcode 114 Flatten Binary Tree to Linked List ----- java

    Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...

随机推荐

  1. Java高并发Lock接口讲解,精准通知线程间的执行顺序

    题目:两个线程操作一个变量,实现两个线程对同一个资源一个进行加1操作,另外一个进行减1操作,且需要交替实现,变量的初始值为0.即两个线程对同一个资源进行加一减一交替操作. Lock接口与Conditi ...

  2. Avalonia跨平台上位机控件开发之水泵

    Avalonia跨平台上位机控件开发之水泵 随着国产化的推进,越来越多的开发者选择使用跨平台的框架来创建上位机应用,而Avalonia正是一个优秀的选择.本文将探讨如何利用Avalonia框架进行水泵 ...

  3. 3-3 C++ vector类型

    目录 3.3.0 模板(Template) vector说明 模板简介 3.3.1 vector的定义和初始化 初始化的方式 总结初始化 3.3.2 往vector中添加元素 3.3.3 vector ...

  4. 无法访问k8s.gcr.io下载镜像问题解决办法

    部署K8S最大的难题是镜像下载,在国内无FQ环境情况下很难从k8s.gcr.io等镜像源里下载镜像. 这种情况下正确做法是: 直接指定国内镜像代理仓库(如阿里云代理仓库)进行镜像拉取下载. 成功拉取代 ...

  5. 在 Github Action 管道内集成 Code Coverage Report

    Github Actions 我们的开源项目 Host 在 Github,并且使用它强大的 Actions 功能在做 CICD.单看 Github Actions 可能不知道是啥.其实它就是我们常说的 ...

  6. 8.Jenkins+Docker+SpringCloud微服务持续集成

    前言 通过前几章的学习,了解了持续集成概念以及相关技术的学习和使用 接下来学习构建一整套SpringCloud微服务+Docker+Jenkins的持续集成案例 环境 架构图 流程说明: 开发人员将代 ...

  7. SQL注入sqlmap联动burpsuite之burp4sqlmap++插件

    目录 sqlmap和burpsuite介绍 sqlmap4burp++介绍 sqlmap4burp++的使用 小插曲:sqlmap报错文件不存在怎么办? 官方扩展CO2之SQLmapper sqlma ...

  8. 前端实战之使用canvas合并图片

    最近做一个完整的系统,前端中涉及到一个推广图片的生成,其中推广图片是由一个变化的链接生成的二维码与一个固定图片拼接而成 实现demo: qrcode.png:https://images.cnblog ...

  9. Redis之内存占用分析工具RDR

    GitHub:https://github.com/xueqiu/rdr 场景:最近Redis爆满, 但是不清楚具体哪些键占用的空间较多, 是否有设置过期时间等情况 1.下载软件 windows:ht ...

  10. Vue第三方插件

    1.滚动条 vuescroll 引入插件 - 官网 <script src="https://unpkg.com/vuescroll"></script> ...