这是我参与「第五届青训营」伴学笔记创作活动的的第12天
RPC框架
分层设计
1.Aoache Thrift
分层结构:
code:用户自己编写的业务逻辑代码
service.processor,read/write:通过代码生成工具把IDL文件转换成不同语言对应的lib代码,里面封装了编解码逻辑
TProtocal:框架的编解码层
TTransport:框架的协议层
Network IO:框架的网络通信层
2.编解码层
1.生成代码:客户和服务器依赖同一份IDL文件,生成不同语言的CodeGen,包括Golang,C++,Java
2.数据格式:
语言特定的格式:许多编程语言都内建了将内存对象编码为字节序列的支持,例如Java有 java.io.Serializable。
文本格式:JSON、XML、cSV等文本格式,具有人类可读性。
二进制编码:具备跨语言和高性能等优点,常见有Thrift的 BinaryProtocol,Protobuf 等。
3.二进制编码:
TLV编码:
Tag:标签,可以理解为类型
Lenght:长度
Value:值,Value也可以是个TLV结构
3.协议层
特殊结束符:一个特殊字符作为每个协议单元结束的标示。
变长协议:以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度。
协议构造:
LENGTH:数据包大小,不包含自身
HEADER MAGIC:标识版本信息,协议解析时候快速校验
SEQUENCE NUMBER:表示数据包的seqID,可用于多路复用,单连接内递增
HEADER SIZE:头部长度,从第14个字节开始计算一直到PAYLOAD前
PROTOCOL ID:编解码方式,有Binary和Compact 两种
TRANSFORM ID:压缩方式,如zlib和snappy
INFO ID:传递一些定制的meta 信息
PAYLOAD:消息体
4.网络通信层
1.Sockets API
2.网络库
提供易用API:封装底层Socket API,连接管理和事件分发
功能:协议支持:tcp、udp和uds等
优雅退出、异常处理等
性能:应用层buffer减少copy
高性能定时器、对象池等