视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Thrift基本原理与应用
2025-10-02 04:39:51 责编:小OO
文档
Thrift基本原理与应用

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 、set、map

异常 

    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下载本文

显示全文
专题