1 背景简介
1.1什么是Thrift?
Thrift是在2007 年 提交Apache 基金会将Thrift 作为一个开源项目,对于当时的 来说创造thrift 是为了解决 系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性。Thrift是一种实现RPC的软件框架,它自定义IDL,消息结构。
1.2RPC与IDL
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
接口描述语言(Interface description language,缩写IDL),是CORBA规范的一部分,是跨平台开发的基础。IDL是用来描述软件组件接口的一种计算机语言。IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流。
1.3 为什么使用Thrift?
(1)实现跨语言通信
支持C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi等多种语言
(2)完成高并发、大数据量传输
(3) 使用方便,需要编写的代码较少Thrift的框架结构和原理
1.4 其他实现RPC的框架和协议
(1)Protocol Buffer,google公司2000年提出的RPC框架
(2)Avro,Apache提出的RPC框架
(3)SOAP:Simple Object Access Protocol,简单对象访问协议
2 Thrift框架结构与基本原理
2.1 Thrift框架结构图
图 1 Thrift框架结构图
2.2 TProtocol
TProtocol主要负责结构化数据组装成Thrift消息结构,或者从消息结构中读出结构化数据。Thrift包含以下几种类型的TPRotocol:
TBinaryProtocol: 所有数据直接按照二进制方式编码
TCompactProtocol:压缩的二进制编码
TDenseProtocol: 类似于TCompactProtocol,但并不是所有语言均支持
TJSONProtocol: 使用JSON编码数据
TSimpleJSONProtocol: 只写方式的JSON 编码
TDebugProtocol: 文本方式编码数据,主要用于调试
2.3 TTransport
以字节流方式发送和接收Thrift消息结构。包含的类型有
TSocket:使用阻塞的 Socket 进行 I/O 传输
TFramedTransport:使用一个带缓存的Socket进行I/O传输
TFileTransport: 使用文件进行 I/O 传输
TZlibTransport: 完成数据的压缩传输
2.4 TServer
接收 Client 的请求,并转到某个TProcessor上进行处理。包含类型有
TSimpleServer:阻塞IO的单线程服务器
TThreadedServer:阻塞IO的多线程服务器
TThreadPoolServer:阻塞IO的多线程服务器,线程池管理线程
TNonBlockingServe:使用非阻塞IO的多线程服务器,TTransport要选用TFramedTransport
3Thrift的应用
3.1 Thrfit使用流程图
图 2 thrift使用流程图
用户只需编写IDL文件,定义服务端接口,搭建/开启服务端,搭建客户端,调用客户端的接口。
3.2 Thrift IDL
(1)数据类型
基本类型
bool、byte、i16、i32、i、double、string,binary
结构体
struct
容器
list 异常 exception 服务 service 域标识符 内部使用i16存储,域标识符和类型名共同决定一个域 (2) IDL举例 struct RequestStruct { 1: i32 requestId 2: string requestData } struct ResponseStruct { 1: i32 responseId 2: string responseData } service ThriftSample //thrift与自定义代码的接口 { ResponseStruct SendReceive(1: RequestStruct request) string GetServerTime() } 3.3 目前Thrift的应用领域或产品 (1) (2) Hadoop 分布式系统基础架构 (3) HBase 开源的非关系型分布式数据库 (4) Python based real-time Web framework (5) Evernote 印象笔记,一款手机软件 …… 4 Thrift的优势及不足 4.1 Thrift、Protocol Buffer、Avro、SOAP性能比较 表1 性能比较结果 4.2 Thrift优缺点总结 (1)相比SOAP,数据量更小,客户端开销小,但是通用性和可扩展性差,数据格式固定,更适合做静态数据交互 (2)相比其他RPC框架结构,Thrift支持的语言更多,支持更多的数据类型 (3)Thrift内嵌了完整RPC实现,PB在文档方面性能更好 5 参考材料 Thrift介绍 http://blog.csdn.net/ellios/article/details/6293129 哪些使用了Thrift http://wiki.apache.org/thrift/PoweredBy Thrift、Protocol Buffers和Avro的比较 http://www.slideshare.net/IgorAnishchenko/pb-vs-thrift-vs-avro下载本文