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

RPC通信原理实战

RPC概念及RPC请求响应流程

RPC概念引入

假设有两个模块,用户和订单

在单体项目中,两个模块被打包到一个包,都处在一个tomcat进程中,用户模块调用订单模块属于同一进程内的本地调用

在微服务项目中,用户模块和订单模块会分别被打成一个包,部署后会运行在两个tomcat进程中,当用户模块调用订单模块方法时,首先将订单服务的maven依赖到两个模块中,然后注入到用户模块中,当调用订单方法时,由于不在同一进程中,需要通过网络调用另一台主机的进程方法,获取到结果后,再通过网络将结果传输回来。

RPC的概念及特点

RPC的作用

1.屏蔽远程调用跟本地调用的区别,调用远程就像是在调用本地
2.屏蔽跨进程跨网络调用底层复杂性,让我们更专注于业务逻辑

常见的RPC实现框架

RPC应用场景

RPC核心技术点和高级特性

RPC核心技术点

序列化技术与通信协议

动态代理

RPC请求调用具体流程

上层开发工作:定义接口,在服务端实现接口,在客户端注入接口并调用接口方法

RPC框架工作:初始化时,为接口生成代理注入到客户端;调用接口时,进行代理实现;然后将数据参数封装到请求中,对请求数据进行序列化,得到二进制数据;然后进行协议编码,把数据填充到协议的某个位置;然后通过客户端网络模块IO将数据发出去;服务端网络模块接收到数据;通过对应协议解码;将得到的二进制数据反序列化;然后调用模块基于传输过来的数据调用具体的接口实现,得到响应数据;响应数据以同样的方式返回客户端。


RPC中的高级特性

服务注册与发现

其他高级特性

RPC的优势

1、让构建分布式应用更容易,解耦服务,容易扩展
2、RPC框架一般使用长链接,不必每次通信都要建立连接,减少网络开销(客户端与服务端建立TCP链接的信道可以不关闭,减少链接时带来的网络开销)
3、RPC框架需要有注册中心,可以动态感知服务变化并可视化
4、丰富的后台管理功能,可统一管理接口服务,对调用方来说是无感知、统一化的操作
5、RPC能做到协议精简,效率更高,私密安全性高(可以不用Http协议进行协议编码解码,用一些精简的二进制协议)
6、RPC的服务治理功能可以让我们很方便的调控流量,参数等
7、RPC是面向服务的更高级的抽象,支持服务注册发现,负载均衡,容错,流量管理等高级特性

RPC实现要点分析

注册中心核心原理

持久节点如果不主动删除就一直在,临时节点如果服务下线就会被删除

JDK动态代理原理

序列化本质及常见序列化方式

通信协议和IO模型

传输层数据传到应用层时是二进制数据,如果用http协议,需要对二进制数据进行协议解码成文本数据。

http协议优缺点

  • 公有协议,通用,利于跨系统通讯
  • 各语言解析库成熟,易于构建异构系统
  • HTTP/1.1协议偏重,体积偏大,性能相对低

自定义通信协议优缺点

  • 协议私有,通信两端要一致
  • 需要自研协议解析库
  • 可以做到协议精简,性能和安全性更高

总结:对于一些开源的RPC框架,大都会自研RPC通信协议,同时也支持HTTP/1.1

IO模型

容错策略

超时重试

调用者调用提供者服务,可能由于提供者出问题出现超时错误,底层会选择尝试调用其他没有出现问题的提供者服务获取返回结果

方案一

时间轮算法

服务熔断降级

消费者调用提供者的接口,提供者的业务代码调用过程中可能会出错,此时可以:

1.不做处理:将错误结果直接返回给消费者

2.降级:对返回结果降级,采用备选的正常结果,但不一定正确

3.熔断:对调用目标设置冷静期,冷静期内到达RPC框架后不对目标发起调用,直接返回降级结果

当服务的失败率到达阈值时,启用服务熔断,进入冷静期,熔断时长过后进入半打开状态,尝试调用服务,若结果返回成功,关闭服务熔断

熔断限流

常见限流算法

令牌桶算法

对突发流量不友好:突发流量大于令牌桶的最大容量时会直接拿满令牌,使得同一时间有大量请求访问资源,服务可能会扛不住。

漏斗算法

以固定的速率放出流量,不管流量来的是否慢/快。可以有效解决突发流量问题。

滑动窗口算法

设置一段时间的流量阈值,在这段时间内,流量不大于阈值时,都会被放行。超过阈值的请求不会被放行。

http://www.xdnf.cn/news/97381.html

相关文章:

  • 香港服务器租用需要哪些性能要求
  • 全球密封淬火炉市场:技术迭代与区域竞争格局深度剖析
  • 配置Spark历史服务器,轻松查看任务记录
  • Ubuntu18.04 升级最新版本Cmake
  • 氢气传感器在燃料电池中的应用解析
  • Spark与Hadoop之间的联系与区别
  • 使用Python将YOLO的XML标注文件转换为TXT文件格式
  • 面向高可靠场景的RISC-V低功耗MCU硬件安全设计
  • 服务器如何修复SSL证书错误?
  • 重塑智慧出行新生态,德赛西威全新战略愿景发布
  • 使用 VSCode 编写 Markdown 文件
  • onlyoffice历史版本功能实现,版本恢复功能,编辑器功能实现 springboot+vue2
  • Flutter 环境搭建
  • Milvus(4):创建 Collections
  • Axure按钮设计分享:打造高效交互体验的六大按钮类型
  • 网络设备配置实战:交换机与路由器的入门到精通
  • Pytest教程:为什么Pytest要用插件模式?
  • Docker核心技术精讲:从入门到企业级实战
  • 0802api设计和实战-网络ajax请求1-react-仿低代码平台项目
  • SQL注入漏洞中会使用到的函数
  • 时序数据库 TDengine 助力石油石化业务, 平滑接替 Oracle 数据库
  • React propsTypes使用方式
  • MyBatis-Plus分页插件的使用
  • Python常用的第三方模块之【jieba库】支持三种分词模式:精确模式、全模式和搜索引擎模式(提高召回率)
  • React组件测试完全指南:从入门到实践
  • 精益数据分析(16/126):掌握关键方法,探寻创业真谛
  • 【Pandas】pandas DataFrame mod
  • 位置编码学习笔记
  • Linux:进程地址空间
  • 【LangChain4j】AI 第一弹:LangChain4j 的理解