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引入。
- 容器(Containers)
Thrift3种可用容器类型:
- list(t): 元素类型为t的有序表,容许元素重复。
- set(t):元素类型为t的无序表,不容许元素重复。对应c++中的set,java中的HashSet,python中的set,php中没有set,则转换为list类型。
- map(t,t): 键类型为t,值类型为t的kv对,键不容许重复。对用c++中的map, Java的HashMap, PHP 对应 array, Python/Ruby 的dictionary。