1.前言
Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言 (IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现。
Thrift与我曾经使用过的ICE很像。ICE是由Zeroc公司开发的网络通信引擎。ICE框架除了完成跨语言调用之外,它提供的服务发布和注册功能(使用ICE registry),pub-sub通信模式,用于更新部署的软件的ICE patch和用于处理跨路由器的ICE glacier 是thrift没有的,这些额外的功能使得用户能更方便的开发自己的私有云服务平台。可以说,ICE比thrift更高一个层次。但是,个人不太喜欢它的很多实现,它们很多功能使用起来都不是很方便。(ICE 3.3.0)
相反而言,另一个与Thrift有关系的开源项目是ZeroMQ。这个项目我个人十分看好,有望进入Linux 内核。ZeroMQ原先制定的目标为AMQ,但是做着做着慢慢演变成通信库了。它精于进程内,进程间,网络,和多播通信,提供了多种多样的通信模式,最大的特点是快(大量使用直接的内存拷贝),安全(通信双方均有消息缓存队列)。与Thrift相比,ZeroMQ低了一个层次,通信双方需要自己做序列化工作,而且没有直接提供rpc功能。
Thrift有两个目标,跨语言通信和提供rpc功能。
2.架构
Thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语 言的支持。用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服 务)便可以了。其中protocol(协议层, 定义数据传输格式,可以为二进制或者XML等)和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用 作运行时库。
3、 支持的数据传输格式、数据传输方式和服务模型
(1)支持的传输格式
TBinaryProtocol – 二进制格式.
TCompactProtocol – 压缩格式
TJSONProtocol – JSON格式
TSimpleJSONProtocol –提供JSON只写协议, 生成的文件很容易通过脚本语言解析。
TDebugProtocol – 使用易懂的可读的文本格式,以便于debug
(2) 支持的数据传输方式
TSocket -阻塞式socker
提供了一个通用,简单的TCP/IP流socket。
TFramedTransport – 以frame为单位进行传输,非阻塞式服务中使用。
TFileTransport – 以文件形式进行传输。
TMemoryTransport – 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream。
TZlibTransport – 使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。
(3)支持的服务模型
TSimpleServer – 简单的单线程服务模型,常用于测试
TThreadPoolServer – 多线程服务模型,使用标准的阻塞式IO。
TNonblockingServer – 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)
参考资料