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框架后不对目标发起调用,直接返回降级结果
当服务的失败率到达阈值时,启用服务熔断,进入冷静期,熔断时长过后进入半打开状态,尝试调用服务,若结果返回成功,关闭服务熔断
熔断限流
常见限流算法
令牌桶算法
对突发流量不友好:突发流量大于令牌桶的最大容量时会直接拿满令牌,使得同一时间有大量请求访问资源,服务可能会扛不住。
漏斗算法
以固定的速率放出流量,不管流量来的是否慢/快。可以有效解决突发流量问题。
滑动窗口算法
设置一段时间的流量阈值,在这段时间内,流量不大于阈值时,都会被放行。超过阈值的请求不会被放行。