Go 语言RPC分层设计 | 青训营笔记

230 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

本文为青训营课程笔记,配合原课程食用效果更佳哦~

RPC课程笔记

分层设计 - 以 Apache Thrift 为例

  1. 用户自己编写的业务逻辑代码
  2. 通过代码生成工具把 IDL 文件
  3. 转换成不同语言对应的 lib 代码,里面封装了编解码逻辑框架的编解码层
  4. 框架的网络通信层
  5. 框架的协议层

编解码层

  • 生成代码
  • 数据格式
    • 语言特定的格式:许多编程语言都内建了将内存对象编码为字节序列的支持,例如 Java 有 java.io.Serializable

    • 文本格式:JSON、XML、CSV 等文本格式,具有人类可读性

    • 二进制编码:具备跨语言和高性能等优点,常见有 Thrift 的 BinaryProtocol,Protobuf 等

    • TLV 编码

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

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

协议层

  • 特殊结束符:一个特殊字符作为每个协议单元结束的标示

    • 变长协议:以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
  • 协议构造

    • LENGTH:数据包大小,不包含自身
    • HEADER MAGIC:标识版本信息,协议解析时候快速校验
    • SEQUENCE NUMBER:表示数据包的 seqID,可用于多路复用,单连接内递增
    • HEADER SIZE:头部长度,从第14个字节开始计算一直到 PAYLOAD前
    • PROTOCOL ID:编解码方式,有 Binary 和Compact 两种
    • TRANSFORM ID:压缩方式,如 zlib 和 snappy
    • INFO ID:传递一些定制的 meta 信息
    • PAYLOAD:消息体
  • 协议解析

网络通信层

  • Sockets API

  • 网络库
    • 提供易用 API

      • 封装底层 Socket API
      • 连接管理和事件分发
    • 功能

      • 协议支持:tcp、udp 和 uds 等
      • 优雅退出、异常处理等
  • 性能

    • 应用层 buffer 减少 copy
    • 高性能定时器、对象池等

02. 小结

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

总结收获

通过样例与知识点结合的方式,学到了一些RPC设计知识;

通过样例的讲解,更了解了具体的RPC设计方法;

又是收获满满的一天

引用参考

青训营官方课程视频

青训营官方课程文档

青训营官方课程笔记