这是我参与「第五届青训营 」笔记创作活动的第10天
RPC,即远程过程调用,在微服务架构当中广泛运用。
RPC作为一个基于网络的框架,采用了和网络一样的分层架构。
函数调用
普通的本地函数调用时,实际上就是简单的压栈弹出。
RPC需要解决的问题:
- 函数映射
- 数据转换成字节流
- 网络传输
一次RPC的完整过程
- IDL文件:描述接口,跨平台跨语言
- 生成代码:通过编译器把IDL文件转换成语言对应的静态库
- 编解码:从内存中表示到字节序列的转换称为编码,反之为解码
- 通信协议:规范了数据在网络中的传输内容和格式
- 网络传输:通常基于成熟的网络库走TCP/UDP
分层设计
编解码层
数据格式:
- 语言特定
- 文本格式
- 二进制编码(常用)
协议层
这部分可以参考tcp、http等
基本概念:
- 特殊结束符
- 变长协议
协议构造:
- LENGTH:数据包大小
- HEADER MAGIC:标识版本信息,协议解析时候快速校验
- SEQUENCE NUMBER:表示数据包的seqID,可用于多路复用,单连接内单增
- HEADER SIZE:头部长度,从第14个字节开始计算一直到PAYLOAD前
- PROTOCOL ID:编解码方式,有Binary和Compact两种
- TRANSFORM ID:压缩方式,如zlib和snappy
- INFO ID:传递一些定制的meta信息
- PAYLOAD:消息体
网络通信层
使用Socket api进行网络通信。
网络库:
- 提供易用API
- 功能
- 性能
关键指标
稳定性
- 熔断
- 限流
- 超时控制
实际上系统的各个部分面对的稳定性挑战都类似,如服务降级,长尾请求等,所以为了保障稳定性的措施也非常类似,在遇到类似的问题时可以优先考虑这些方案。
易用性
- 开箱即用
- 周边工具
扩展性
- Middleware
- Option
- 编解码层
- 协议层
- 网络传输层
- 代码生成工具插件扩展
观测性
- Log、Metric、Tracing
- 内置观测性服务
高性能
手段:
- 连接池
- 多路复用
- 高性能编解码协议
- 高性能网络库