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

设计一个灵活的RPC架构

RPC架构

RPC本质上就是一个远程调用,需要通过网络来传输数据。传输协议可以有多种选择,但考虑到可靠性,一般默认采用TCP协议。为了屏蔽网络传输的复杂性,需要封装一个单独的数据传输模块用来收发二进制数据,这个单独模块可以叫做传输模块

网络数据传输是二进制数据,涉及对象的序列化与反序列化。数据拆分协议封装。

网络传输过程中,请求数据包在数据链路层可能会因为太大而被拆分成多个数据包进行传输,为了减少被拆分的次数,从而导致整个传输时间太长,在方法调用参数或者返回值的二进制数据大于某个阈值时,可以通过压缩框架进行无损压缩,然后在另外一端用同样的压缩算法进行解压,保证数据可还原。

当一个接口有着多个服务提供者时,服务对调用方是透明的。RPC需要提供“服务发现”机制,在RPC里面维护好接口跟服务提供者地址的关系,调用方可以快速找到调用地址。

对RPC来说,每次发送请求时都需要用TCP连接,相对服务提供方IP地址,TCP连接状态是瞬息万变的,因此RPC框架里面要有连接管理器维护TCP连接的状态

有了集群之后,提供方需要管理好这些服务。RPC就需要内置一些服务治理的功能,比如服务提供方权重的设置、调用授权等一些常规治理手段。

image-20241030222942238

可扩展架构

RPC框架设计之初不可能面面俱到,如何应对技术迭代呢?

插件化架构

RPC框架中,将每个功能点抽象成一个接口,接口作为插件的契约,功能的接口与功能的实现分离,并提供接口的默认实现。

JDK自带的SPI(Service Provider Interface)服务发现机制,可以动态地为某个接口寻找服务实现。使用SPI机制需要在Classpath下的META-INF/services目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体实现类。如下,文件名和内容都是接口和实现类全包名。

image-20240417220139791

然而,JDK自带的SPI机制使用比较少,不能按需加载,ServiceLoader加载某个接口实现类的时候,会遍历全部获取,接口的实现类全部载入并实例化一遍,会造成不必要的浪费,扩展性比较差。

image-20241030224418544

功能点抽象成一个接口,将接口作为插件的契约,功能的接口与功能的实现分离并提供接口的默认实现。可扩展性很好,用户可以方便地通过插件扩展实现自己的功能。无需修改核心功能本身;保持了核心包的精简,依赖外部包少。

http://www.lryc.cn/news/473868.html

相关文章:

  • 大数据计算里的Broadcast Hash Join/Shuffle Hash Join/Sort Merge Join
  • Java - 手写识别; 如何用spring ai和大模型做手写识别教程
  • 【Linux】用户权限管理:创建受限用户并配置特定目录访问权限
  • pgsql表分区和表分片设计
  • 灵动AI ——视频创作新引擎 开启视觉奇幻之旅
  • AI设计、作图、画画工具哪个好用?看完这篇你就知道怎么选了
  • 【python ASR】win11-从0到1使用funasr实现本地离线音频转文本
  • myqld二进制安装和破解数据库密码(linux)
  • 防重方案-订单防重方案笔记
  • HTML、JavaScript和CSS实现注册页面设计
  • Counter对象的使用样例
  • 大模型中的token是什么;常见大语言模型的 token 情况
  • Python小白学习教程从入门到入坑------第十七课 内置函数拆包(语法基础)
  • 动态规划 —— 路径问题-最小路径和
  • 《链表篇》---删除链表的倒数第N个节点(中等)
  • duilib 进阶 之 TileListBox 列表
  • Web应用安全—信息泄露
  • 大数据治理:策略、技术与挑战
  • vscode插件-08 Golang
  • 数据结构+算法分析与设计[15-18真题版]
  • 单链表OJ题(2):反转链表(三指针法)、找中间节点(快慢指针)
  • Rows 行
  • 十个常见的软件测试面试题,拿走不谢
  • windows 11 配置 kafka 使用SASL SCRAM-SHA-256 认证
  • Elasticsearch —— ES 环境搭建、概念、基本操作、文档操作、SpringBoot继承ES
  • ElSelect 组件的 onChange 和 onInput 事件的区别
  • 加密与数据提取:保护隐私的新途径
  • 博客摘录「 宋宝华:Linux文件读写(BIO)波澜壮阔的一生」2024年11月1日
  • 使用华为云数字人可以做什么
  • leetcode刷题记录——(十六)349. 两个数组的交集