go框架设计2 | 青训营笔记

88 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的的第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

高性能定时器、对象池等