动手点关注干货不迷路 👆
背景
Thrift 是 Facebook 开源的一个高性能,轻量级 RPC 服务框架,是一套全栈式的 RPC 解决方案,包含序列化与服务通信能力,并支持跨平台/跨语言。整体架构如图所示:

Thrift 软件栈定义清晰,各层的组件松耦合、可插拔,能够根据业务场景灵活组合,如图所示:

Thrift 本身是一个比较大的话题,这篇文章不会涉及到全部内容,只会涉及到其中的序列化协议。

协议原理
Binary 协议
消息格式
这里通过一个示例对 Binary 消息格式进行直观的展示,IDL 定义如下:
// 接口
service SupService {
SearchDepartmentByKeywordResponse SearchDepartmentByKeyword(
1: SearchDepartmentByKeywordRequest request)
}
// 请求
struct SearchDepartmentByKeywordRequest {
1: optional string Keyword
2: optional i32 Limit
3: optional i32 Offset
}
// 假设request的payload如下:
{
Keyword: "lark",
Limit: 50,
Offset: nil,
}
编码简图

编码具体内容
抓包拿到编码后的字节流(转成了十进制,方便大家看)
/* 接口名长度 */ 0 0 0 25
/* 接口名 */ 83 101 97 114 99 104 68 101 112 97 114 116
109 101 110 116 66 121 75 101 121 119 111
114 100
/* 消息类型 */ 1
/* 消息序号 */ 0 0 0 1
/* keyword 字段类型 */ 11
/* keyword 字段ID*/ 0 1
/* keyword len */ 0 0 0 4
/* keyword value */ 108 97 114 107
/* limit 字段类型 */ 8
/* limit 字段ID*/ 0 2
/* limit value */ 0 0 0 50
/* 字段终止符 */ 0
编码含义
消息头