这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
程序一般分为本地函数调用和远程函数调用,本节课所学的 RPC 就是远程函数调用,它需要解决下面的问题
- 函数映射
- 数据转换成字节流
- 网络传输
RPC的概念模型
RPC的过程由5个模型组成
- User
- User-Stub
- RPC-Runtime
- Server-Stub
- Server
一次RPC的完整过程
- IDL文件
- 生成代码
- 编解码
- 通信协议
- 网络传输
使用RPC的好处
- 单一职责,有利于分工协作和运维开发
- 可拓展性强,资源使用更优
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架分层设计
编解码层
数据格式
- 语言指定格式,比如Java语言中的 java.io.Serializable
- 文本格式:例如 JSON、XML、CSV 等
- 二进制编码:常见有 Thrift 的 BinaryProtocol,Protobuf,实现可以有多种形式,例如 TLV 编码 和 Varint 编码
选型考察点
- 兼容性
- 通用性
- 时间、空间开销
协议层
Thirft的THeader协议为例,通信协议的数据结构如下:
协议解析的过程中,先PEEK获取MagicNumber,然后再Peek获取PayloadCodec,最后直接解码,获得数据Payload。
网络通信层
- 阻塞 IO 下,耗费一个线程去阻塞在 read(fd) 去等待用足够多的数据可读并返回。
- 非阻塞 IO 下,不停对所有 fds 轮询 read(fd) ,如果读取到 n <= 0 则下一个循环继续轮询。
RPC框架核心指标
稳定性
为了保证稳定性,需要准备保障策略,比如熔断、限流、超时控制。还需要保证请求的成功率,比如使用负载均衡,重试等功能。
易用性
RPC需要开箱即用,支持使用代码生成工具或脚手架工具,快速生成业务代码。
拓展性
middleware 会被构造成一个有序调用链逐个执行,比如服务发现、路由、负载均衡、超时控制等
观测性
内置观测性服务,用于观察框架内部的状态,获取环境变量,参数等信息。
高性能
- 使用连接池和多路复用
- 高性能编解码协议
- 高性能网络库