开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情 这也是第33篇文章
参考资料
掘金——课程——字节内部课——后端——深入浅出RPC框架
引入
一些特别概念性的前置知识已经在 计网复习随手记中提到。
回顾一个问题:
- 本地调用时,客户端是如何把参数值传给远程参数的?RPC中又是如何实现的? 本地时是通过内存。把参数压入栈中,然后函数去读取; 在RPC中,先将参数转为字节流,通过网络传输到服务端,服务端再解析(序列化和反序列化)
RPC框架分层设计
核心有三层:编解码层、协议层、网络通信层
编解码层
任务:序列化与反序列化
比如二进制编码可表示为一种TLV编码(type-length-value)
协议层
协议格式
- LENGTH:数据包大小,不包含自身
- HEADER MAGIC:标识版本信息,协议解析时快速校验
- SEQUENCE NUMBER:表示数据包的seqID,可用于多路复用,单连接内递增
- HEADER SIZE:头部长度,从第14个字节开始计算一直到PAYLOAD前
- PROTOCOLID:编解码方式,有Binary和Compact两种
- TRANSFORMID:压缩方式,如zlib和snappy
- INFOID:传递一些定制的meta信息
- PAYLOAD:消息体
网络通信层
socket-api的调用流程以前也学过了,这里不再赘述。
性能指标
稳定性、易用性、拓展性、可观测性、高性能
稳定性
保障策略
熔断、限流、超时控制
请求成功率
负载均衡、重试
长尾请求
含义:前一个请求的应答在后一个请求的应答都到来之后才到来
中间件
总结
- 框架通过中间件来注入各种服务治理策略,保障服务的稳定性
- 通过提供合理的默认配置和方便的命令行工具可以提升框架的易用性
- 框架应当提供丰富的扩展点,例如核心的传输层和协议层
- 观测性除了传统的Log、Metric和Tracing之外,内置状态暴露报务也很有必要
- 性能可以从多个层面去优化,例如选择高性能的编解码协议和网络库