Thrift架构
Thrift网络栈
TTransport
传输层,定义数据传输方式
传输协议
- TSocket:阻塞式socket
- TFramedTransport:frame为单位进行传输,非阻塞式
- TFileTransport:文件形式传输
- TMemoryTransport:直接对内存进行I/O
- Java实现时使用了简单的ByteArrayOutputStream
- TZlibTransport:使用zlib进行压缩,同其他方式联合使用
TProtocol
协议层,定义数据传输格式
数据格式
- TBinaryProtocal:二进制格式
- TCompactProtocal:压缩格式
- TJSONProtocol:JSON格式
- TSimpleJSONProtocal:提供JSON只写协议,生成文件容易
通过脚本语言解析
- TDebugProtocol:简单易懂的可读文本格式,便于debug
TProcessor
封装了从输入数据流中读取、向输出数据流中写的操作
- 读写数据流用TProtocol对象表示
- 和服务相关的TProcessor由Thrift编译器产生
- 工作流程
- 使用输入TProtocol从连接中读取数据
- 将处理授权给用户实现的handler
- 使用输出TProtocol向连接中写入数据
服务模型
- 创建TTransport对象
- 为TTransport对象创建输入、输出TProtocol对象
- 基于输入、输出TProtocol对象创建TProcessor对象
- 等待连接请求,交由TProcessor处理
支持的服务模型
- TSimpleServer:简单单线程服务模型
- TThreadPoolServer:多线程服务模型,使用标准阻塞式I/O
- TNonblockingServer:多线程服务模型,使用非阻塞式I/O
Thrift语法
句法
函数
参数
- 可以是基本类型、结构体
- 参数是常量
const
,不能作为返回值
返回值
数据类型
基本类型
不支持无符号整形
bool
byte
i16
i32
i64
double
string
binary
:字节数组
泛型(容器)
容器中元素类型可以是除了service以外的任何类型(包括结构体、
异常)
map<t1, t2>
:字典
list<t1>
:列表
set<t1>
:集合
结构体
Thrift结构体概念上同C结构体:将相关数据封装
1 2 3 4 5 6
| struct Work { 1: i32 num1=0, 2: i32 num2, 3: Operation op, 4: optional string comment, }
|
Exception
1 2 3 4
| exception InvalidOperation { 1: i32 what, 2: string why }
|
- 异常在语法、功能上类似于结构体,使用
exception
声明,但
语义不同
Service
Thrift编译器根据选择的目标语言为server产生服务接口代码,为
client产生桩代码
- 函数、参数列表定义方式同struct
- 支持继承:
extends
1 2 3 4 5 6
| service Twitter { # Twitter和`{`中需要有空格 void ping(), bool postTweet(1: Tweet tweet); TweetSearchResult searchTweets(1: string query); oneway void zip();
|
enum
枚举类型
1 2 3 4 5 6
| enum TweetType { TWEET, RETWEET = 2, DM = 0xa, REPLY }
|
const
常量
1 2
| const i32 INT_CONST = 1234 const map<string, string> MAP_CONST = {"hello": "world", "1": "2"}
|
typedef
namespace
Thrift命名空间同C++中namespace类似
- 均提供组织(隔离)代码的方式
- 因为不同的语言有不同的命名空间定义方式(如:python中
module),Thrift允许针对特定语言定义namespace
1 2
| namespace cpp com.example.project namespace java com.example.project
|