这是我参与「第五届青训营 」伴学笔记创作活动的第14天,今天学习了RPC框架理论,下面是我的笔记。
1、RPC基本概念
- RPC:远程函数调用
- 通过网络协议调用远程函数
一次RPC的完整过程:
- IDL(Interface description language):通过一种中立的方式描述接口,使得在不同平台上运行的对象和不同语言编写的程序可以相互通信
- 生成代码:通过编译器工具吧IDL文件转换成语言对应的静态库
- 编解码 ,序列化与反序列化
- 通信协议:规范了数据在网络中的传输内容和格式,除必须请求/响应数据外,通常还会包含额外的元数据。
- 网络传输:通常基于成熟的网络库走TCP/UDP传输
RPC的好处:
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
概念模型:
-
User User-stub RPCRuntime Server-stub Server
-
User 就是 Client 端。当 User 想发起一个远程调用时,它实际是通过本地调用 User-stub。 User-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。 远端 RPCRuntime 实例收到请求后交给 Server-stub 进行解码后发起向本地端 Server 的调用,调用结果再返回给 User 端。
2、RPC框架
RPC 框架分层设计
-
编解码层
- 数据格式:
- 语言特定格式
- 文本格式
- 二进制编码
- TLV 编码:Thrift 使用 TLV 编码
- Varint 编码:Protobuf 使用 Varint 编码
- 数据格式:
-
传输协议层
- 消息切分
- 特殊结束符
- 变长协议:length+body
- 消息切分
-
网络通信层
- 网络库
- 核心指标
- 吞吐高
- 延迟低
RPC框架核心指标
- 稳定性
- 熔断:保护调用方:一个服务A调用服务B时,服务B的业务逻辑调用C,c超时,导致B一直等待,而A一直调用服务B,而导致请求宕机
- 限流:保护被调用方:当调用端发送请求过来时,服务端在执行业务逻辑之前先检查限流逻辑,如果发现访问量过大并且超出了限流条件,就让服务端降级处理或者返回给调用方一个限流异常
- 超时:避免浪费资源在不可用结点,服务降级
- 易用性
- 开箱即用
- 良好的周边工具
- 扩展性
- 观测性
- Log,Metric,Tracing
- 内置观测性服务
- 高性能
- 高吞吐量,低延迟
- 连接池
- 多路复用
- 高性能编解码协议
- 高性能网络库
3、小结
- 框架通过中间件来注入各种服务治理策略,保障服务的稳定性。
- 通过合理的默认配置和命令行工具可以提升框架的易用性。
- 框架应该提供丰富的扩展点
- 观测性除了传统的Log,tracing,内置状态暴露服务也很有必要
- 性能可以从多个层面去优化,选择高性能的编解码协议和网络库