这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
本文为青训营课程笔记,配合原课程食用效果更佳哦~
RPC课程笔记
分层设计 - 以 Apache Thrift 为例
- 用户自己编写的业务逻辑代码
- 通过代码生成工具把 IDL 文件
- 转换成不同语言对应的 lib 代码,里面封装了编解码逻辑框架的编解码层
- 框架的网络通信层
- 框架的协议层
编解码层
-
生成代码
-
数据格式
-
语言特定的格式:许多编程语言都内建了将内存对象编码为字节序列的支持,例如 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. 小结
- RPC 框架主要核心有三层:编解码层、协议层和网络通信层
- 二进制编解码的实现原理和选型要点
- 协议的一般构造,以及框架协议解析的基本流程
- Socket API 的调用流程,以及选型网络库时要考察的核心指标
总结收获
通过样例与知识点结合的方式,学到了一些RPC设计知识;
通过样例的讲解,更了解了具体的RPC设计方法;
又是收获满满的一天
引用参考
青训营官方课程视频
青训营官方课程文档
青训营官方课程笔记