分层设计
1 分层设计 - 以 Apache Thrift 为例
2 编解码层
3 编解码层 - 生成代码
4 编解码层 - 数据格式
- 语言特定的格式
- 许多编程语言都内建了将内存对象编码为字节序列的支持,例如 Java 有 java.io.Serializable
- 文本格式
- JSON、XML、CSV 等文本格式,具有人类可读性
- 二进制编码
- 具备跨语言和高性能等优点,常见有 Thrift 的 BinaryProtocol,Protobuf 等
5 编解码层 - 二进制编码
- TLV 编码
- Tag: 标签,可以理解为类型
- Lenght: 长度
- Value: 值,Value 也可以是个TLV结构
6 编解码层 - 选型
- 兼容性
- 支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
- 通用性
- 支持跨平台、跨语言
- 性能
- 从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长
7 协议层 - 概念
- 特殊结束符
- 个特殊字符作为每个协议单元结束的标示
- 个特殊字符作为每个协议单元结束的标示
- 变长协议
- 以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
- 以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
8 协议层 - 协议构造
- LENGTH: 数据包大小,不包含自身
- HEADER MAGIC: 标识版本信息,协议解析时候快速校误验
- SEQUENCE NUMBER: 表示数据包的 seqlD.可用于多路复用,单连接内递增
- HEADER SIZE: 头部长度,从第14个字节开始计算一直到 PAYLOAD 前
- PROTOCOL ID: 编解码方式,有 Binary 和 Compact 两种
- TRANSFORM ID: 压缩方式,如 zlib 和 snappy
- INFO ID: 传递一些定制的 meta 信息
- PAYLOAD: 消息体
9 网络通信层 - 网络库
- 提供易用 API
- 封装底层 Socket API
- 连接管理和事件分发
- 功能
- 协议支持: tcp、udp 和 uds 等
- 优雅退出、异常处理等
- 性能
- 应用层 buffer 减少 copy
- 高性能定时器、对象池等
小结
- RPC 框架主要核心有三层:编解码层、协议层和网络通信层
- 二进制编解码的实现原理和选型要点
- 协议的一般构造,以及框架协议解析的基本流程
- 网络库的基本架构,以及选型时要考察的核心指标