RPC 框架分层设计|青训营

104 阅读2分钟

分层设计

1 分层设计 - 以 Apache Thrift 为例

4a7aef9d606caf7b008fa6decb4b298.png

2 编解码层

3 编解码层 - 生成代码

1b7f915d2d749d82d9939cb39a25d28.png

4 编解码层 - 数据格式

  • 语言特定的格式
    • 许多编程语言都内建了将内存对象编码为字节序列的支持,例如 Java 有 java.io.Serializable
  • 文本格式
    • JSON、XML、CSV 等文本格式,具有人类可读性
  • 二进制编码
    • 具备跨语言和高性能等优点,常见有 Thrift 的 BinaryProtocol,Protobuf 等

5 编解码层 - 二进制编码

  • TLV 编码
    • Tag: 标签,可以理解为类型
    • Lenght: 长度
    • Value: 值,Value 也可以是个TLV结构

6 编解码层 - 选型

  • 兼容性
    • 支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
  • 通用性
    • 支持跨平台、跨语言
  • 性能
    • 从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长

7 协议层 - 概念

  • 特殊结束符
    • 个特殊字符作为每个协议单元结束的标示 image.png
  • 变长协议
    • 以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度 image.png

8 协议层 - 协议构造

image.png

  • 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
    • 高性能定时器、对象池等

小结

  1. RPC 框架主要核心有三层:编解码层、协议层和网络通信层
  2. 二进制编解码的实现原理和选型要点
  3. 协议的一般构造,以及框架协议解析的基本流程
  4. 网络库的基本架构,以及选型时要考察的核心指标