错位匹配
Thrift协议
Thrift⾃下到上可以分为4层
Server(single-threaded, event-driven etc)
Processor(compiler generated)
RPC接⼝处理函数分发,IDL定义接⼝的实现将挂接到这⾥⾯ Protocol (JSON, compact etc)
协议
Transport(raw TCP, HTTP etc)
Thrift实际上是实现了C/S模式,通过代码⽣成⼯具将接⼝定义⽂件⽣成服务器端和客户端代码(可以为
不同语⾔),从⽽实现服务端和客户端跨语⾔的⽀持。⽤户在Thirft描述⽂件中声明⾃⼰的服务,这些服务经过编译后会⽣成相应语⾔的代码⽂件,然后⽤户实现服务(客户端调⽤服务,服务器端提服务)便可以了。其中protocol(协议层, 定义数据传输格式,可以为⼆进制或者XML等)和transport(传输层,定义数据传输⽅式,可以为TCP/IP传输,内存共享或者⽂件共享等)被⽤作运⾏时库。
Thrift⽀持的传输及服务模型
⽀持的传输格式:
参数描述
TBinaryProtocol ⼆进制格式
TCompactProtocol 压缩格式
TJSONProtocol JSON格式
蔬菜包装盒TSimpleJSONProtocol 提供JSON只写协议, ⽣成的⽂件很容易通过脚本语⾔解析。
TDebugProtocol 使⽤易懂的可读的⽂本格式,以便于debug
⽀持的数据传输⽅式:
参数描述
TSocket 阻塞式socker
TFramedTransport 以frame为单位进⾏传输,⾮阻塞式服务中使⽤。
电磁TFileTransport 以⽂件形式进⾏传输。
TMemoryTransport 将内存⽤于I/O. java实现时内部实际使⽤了简单的ByteArrayOutputStream。
TZlibTransport 使⽤zlib进⾏压缩,与其他传输⽅式联合使⽤。当前⽆java实现。
微孔板孵育器⽀持的服务模型:
参数描述
TSimpleServer 简单的单线程服务模型,常⽤于测试
TThreadPoolServer 多线程服务模型,使⽤标准的阻塞式IO。
TNonblockingServer 多线程服务模型,使⽤⾮阻塞式IO(需使⽤TFramedTransport数据传输⽅式)
bool: 布尔值 (true or false), one byte
byte: 有符号字节
i16: 16位有符号整型
i32: 32位有符号整型
i64: 64位有符号整型
double: 64位浮点型
string: Encoding agnostic text or binary string
struct结构体 thrift中struct是定义为⼀种对象,和⾯向对象语⾔的class差不多.,但是struct有以下⼀些约束:
struct不能继承,但是可以嵌套,不能嵌套⾃⼰。
1. 其成员都是有明确类型插销螺母
直线导轨滑台
2. 成员是被正整数编号过的,其中的编号使不能重复的,这个是为了在传输过程中编码使⽤。
3. 成员分割符可以是逗号(,)或是分号(;),⽽且可以混⽤,但是为了清晰期间,建议在定义中只使⽤⼀种,⽐如C++学习者可以就使⽤分号(;)。
4. 字段会有optional和required之分和protobuf⼀样,但是如果不指定则为⽆类型–可以不填充该值,但是在序列化传输的时候也会序列化进去,
optional是不填充则部序列化,required是必须填充也必须序列化
5. 每个字段可以设置默认值
6. 同⼀⽂件可以定义多个struct,也可以定义在不同的⽂件,进⾏include引⼊。
Expand source
Thrift3种可⽤容器类型:
1.
1. list(t): 元素类型为t的有序表,容许元素重复。
2. set(t):元素类型为t的⽆序表,不容许元素重复。对应c++中的set,java中的HashSet,python中的set,php中没有set,则转换为list
类型。
3. map(t,t): 键类型为t,值类型为t的kv对,键不容许重复。对⽤c++中的map, Java的HashMap, PHP 对应 array, Python/Ruby 的
dictionary。
容器中元素类型可以是除了service外的任何合法Thrift类型(包括结构体和异常)。为了最⼤的兼容性,map的key最好是thrift的基本类型,有些语⾔不⽀持复杂类型的key,JSON协议只⽀持那些基本类型的key。容器都是同构容器,不失异构容器。