目录
IDL文件示例
struct Header {
1: string sendHostName,
3: string senderHostIP,
12: i32 sendCount,
13: map<string,string> nameMapping,
14: list<i32> nums;
}
Thrift message概览
Thrift通信单元
thrift通信的单元是一个message,格式如下:
各字段解释:
1)版本号:用15个bit表示,因为前导1的存在,这16位总是一个负数。
每次预先读取msg的前32位,使用VERSION_MASK 0xffff0000来获取前16位。
目前默认的版本号是0x80010000。
2)待使用:待使用的一个字节。
3)消息类型:用后3个bit表示消息类型,分别是:
消息类型 | 16进制值 | 处理方式 |
---|---|---|
CALL | 0x80010001 | 调用方法,并期望获得返回 |
REPLY | 0x80010002 | 来自服务端的返回消息 |
EXCEPTION | 0x0x80010003 | 服务端处理请求时出现异常 |
ONEWAY | 0x80010004 | 单向请求,不需要返回 |
4)方法名的长度:用4个字节来表示。
5)方法名:调用的方法的名称,长度由方法名长度来表示,UTF-8的编码。
6)序列号:负责排序。
通信单元的数据载荷–Struct
Thrift的message中的有效数据载荷部分由一个或者多个struct组成(除了请求方法名),一个struct由多个Field组成,Field的编码格式如下:
其中,field type是任何一个基本类型,fieldId是定义IDL文件时写在属性最左方的数字(比如sendHostName属性的fieldId是1),fieldValue则是基本类型序列化之后的结果。
Thrift基本类型列表:
基本类型名 | idl类型名 | 对应的Java类型 | 占用字节数 | 类型ID |
---|---|---|---|---|
bool | bool | bool | 1 | 2 |
byte | byte | byte | 1 | 3 |
short | i16 | short | 2 | 6 |
int | i32 | int | 4 | 8 |
long | i64 | long | 8 | 10 |
double | double | double | 8 | 4 |
string | string | java.lang.String | 4+N | 11 |
[]byte | binary | java.nio.ByteBuffer | 4+N | 11 |
list | list | java.util.List(java.util.ArrayList) | 1+4+N | 15 |
set | set | (java.util.Set)java.util.HashSet | 1+4+N | 14 |
map | map | java.util.Map(java.util.HashMap) | 1+1+4+NX+NY | 13 |
field | 1+2+X | |||
struct | struct N*X | 12 | ||
enum | ||||
union | ||||
exception |
这里要注意的是binary类型的数据,它的类型ID是string的类型ID。