参考文档: http://dongxicheng.org/search-engine/thrift-framework-intro/html
Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift经过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,而后经过一个编译器生成不一样语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现。web
Thrift的系统架构apache
Thrift包含一个完整的堆栈结构用于构建客户端和服务器端。下图描绘了 Thrift 的总体架构。服务器
如图所示,图中黄色部分是用户实现的业务逻辑,褐色部分是根据 Thrift 定义的服务接口描述文件生成的客户端和服务器端代码框架,红色部分是根据 Thrift 文件生成代码实现数据的读写操做。红色部分如下是 Thrift 的传输体系、协议以及底层 I/O 通讯,使用 Thrift 能够很方便的定义一个服务而且选择不一样的传输协议和传输层而不用从新生成代码。网络
Thrift其实是实现了C/S模式,经过代码生成工具将接口定义文件生成服务器端和客户端代码(能够为不一样语言),从而实现服务端和客户端跨语言的支持。用户在Thirft描述文件中声明本身的服务,这些服务通过编译后会生成相应语言的代码文件,而后用户实现服务(客户端调用服务,服务器端提服务)即可以了。其中protocol(协议层, 定义数据传输格式,能够为二进制或者XML等)和transport(传输层,定义数据传输方式,能够为TCP/IP传输,内存共享或者文件共享等)被用做运行时库。数据结构
Thrift代码产生方式多线程
Thrift的网络栈以下所示:架构
Thrift支持的数据类型框架
Thrift 脚本可定义的数据类型包括如下几种类型:工具
Thrift支持的传输格式
Thrift可让你选择客户端与服务端之间传输通讯协议的类别,在传输协议上整体上划分为文本(text)和二进制(binary)传输协议, 为节约带宽,提供传输效率,通常状况下使用二进制类型的传输协议为多数,但有时会仍是会使用基于文本类型的协议,这须要根据项目/产品中的实际需求:
使用Thrift和其余方式的所产生的内容大小比较结果以下:
在上图中咱们能明显看出,最臃肿的是RMI,其次是xml,使用Thrift的TCompactProtocol协议和Google 的 Protocol Buffers 相差的不算太多,相比而言仍是Google 的 Protocol Buffers效果最佳。
使用Thrift 中的协议和其余方式的所产生的运行开销比较结果以下:
在上图中咱们能明显看出,最占资源是REST-XML协议,使用Thrift的TCompactProtocol协议和Google 的 Protocol Buffers 相差的不算太多,相比而言Thrift的TCompactProtocol协议效果最佳。
Thrift支持的传输方式
Thrift支持的服务模型
参考资料: