thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发,它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、and OCaml这些编程语言的无缝结合的、搞笑的服务。
1、架构
thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在thrift描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提供服务)便可以了。其中protocol(协议层,定义数据传输格式,可以为二进制或者XML等)和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。
2、支持的数据传输格式、数据传输方式和服务模型
(1)支持的传输格式
TBinaryProtocol-二进制格式
TCompactProtocol-压缩格式
TJSONProtocol-JSON格式
TSimpleJSONProtocol-提供JSON只写协议,携程的文件很容易通过脚本语言解析
TDebugProtocol-使用易懂的可读的文本格式,便于debug
(2)支持的数据传输格式
TSocket-阻塞式socket
TFramedTransport-以frame为单位进行传输,非阻塞式服务中使用
TFileTransport-以文件形式进行传输
TMemoryTransport-将内存用于I/O.java实现时内部实际使用了简单的ByteArrayOutoutStream
TZlibTransport-使用zlib进行压缩,与其他传输方式联合使用。当前无.java实现
(3)支持的服务模型
TSimpleServer-简单的单线程服务模型,常用于测试
TThreadPoolServer-多线程服务模型,使用标准的阻塞式IO
TNonblockingServe-多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)
3、thrift中的类型
thrift类型系统包括预定义基本类型,用户自定义结构体,容器类型,异常和服务定义
(1)基本类型
bool:布尔类型(true or false),占一个字节
byte:有符号字节
i16:16位有符号整数
i32:32位有符号整数
i64:64位有符号整数
double:64位浮点数
string:未知编码或者二进制的字符串
注意,thrift不支持无符号整型,因为很多目标语言不存在无符号整型(如java).
(2)容器类型
thrift容器与类型密切相关,它与当前流行编程语言提供的容器类型相对应,采用Java泛型风格表示的。thrift提供了三种容器类型:
List<t1>:一系列t1类型的元素组成的有序表,元素可以重复
Set<t1>:一系列t1类型的元素组成的无序表,元素唯一
Map<t1,t2>:key/value对(key的类型是t1且key唯一,value类型是t2)。
容器中的元素类型可以是除了service以外的任何合法的thrift类型(包括结构体和异常)。
(3)结构体和异常
thrift结构体在概念上同C语言结构体类型——一种相关属性聚集(封装)在一起的方式。在面向对象的语言中,thrift结构体被转换成类。
异常在语法和功能上类似于结构体,只不过异常使用关键字exception而不是struct关键字声明。但它在语义上不同于结构体——当定义一个RPC服务时,开发者可能需要声明一个远程方法抛出一个异常。
(4)服务
服务的定义方法在语法上等同于面向对象语言中定义接口。thrift编译器会产生实现这些接口的client和server桩。
(5)类型定义
thrift支持C/C++风格的typedef
typedef i32 MyInteger \\a
typedef Tweer ReTweet \\b
说明:
a:末尾没有逗号
b:struct可以使用typedef