`
san_yun
  • 浏览: 2662753 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Thrift跨语言调用方案

 
阅读更多

之前一直设想python和java之间能比较好的通信,可以使用Thrift

Thrift  是什么?
  Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的 facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性。所以thrift可以支持多种程序语言,例如:  C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多种不同的语言之间通信thrift可以作为二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。Thrift适用于程序对程 序静态的数据交换,需要先确定好他的数据结构,他是完全静态化的,当数据结构发生变化时,必须重新编辑IDL文件,代码生成,再编译载入的流程,跟其他 IDL工具相比较可以视为是Thrift的弱项,Thrift适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部数据传输相对于JSON和 xml无论在性能、传输大小上有明显的优势。

   Thrift是IDL(interface definition language)描述性语言的一个具体实现,关于IDL的话题我们可以追溯到CORBA盛行1999-2001年(Common Object Request Broker Architecture/公用对象请求代理体系结构),在 IDL 中我们似乎不会忘记到这几个关键字:module、interface、string、long 和 int,我还记得IDL利用module来创建名称空间,并且准确地映射为 Java 的 package,这些特性几乎和现在thrift的特性完全相同,所以thrift的设计思想和理念绝不是什么从火星来的new idea,看看在那个CORBA盛行的年代人们提出的概念,如图所示CORBA 请求的各个部分,回头我们再与thrift进行对比一下:

Common Object Request Broker Architecture

Thrift 基础架构
   Thrift是一个服务端和客户端的架构体系,从我个人的感官上来看Thrift是一个类似XML-RPC+Java-to- IDL+Serialization Tools=Thrift 的东东,Thrift 具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports),通过IDL脚本对传输数据的数据结构(struct) 和传输数据的业务逻辑(service)根据不同的运行环境快速的构建相应的代码,并且通过自己内部的序列化机制对传输的数据进行简化和压缩提高高并发、 大型系统中数据交互的成本,下图描绘了Thrift的整体架构,分为6个部分:1.你的业务逻辑实现(You Code) 2.客户端和服务端对应的Service 3.执行读写操作的计算结果4.TProtocol 5.TTransports  6.底层I/O通信
thrift

图 中前面3个部分是1.你通过Thrift脚本文件生成的代码,2.图中的褐色框部分是你根据生成代码构建的客户端和处理器的代码,3.图中红色的部分是2 端产生的计算结果。从TProtocol下面3个部分是Thrift的传输体系和传输协议以及底层I/O通信,Thrift并且提供 堵塞、非阻塞,单线程、多线程的模式运行在服务器上,还可以配合服务器/容器一起运行,可以和现有JEE服务器/Web容器无缝的结合。

数据类型
     * Base Types:基本类型
     * Struct:结构体类型
     * Container:容器类型,即List、Set、Map
     * Exception:异常类型
     * Service: 定义对象的接口,和一系列方法

协议
  Thrift可以让你选择客户端与服务端之间传输通信协议的类别,在传输协议上总体上划分为文本(text)和二进制(binary)传输协议, 为节约带宽,提供传输效率,一般情况下使用二进制类型的传输协议为多数,但有时会还是会使用基于文本类型的协议,这需要根据项目/产品中的实际需求:
    * TBinaryProtocol – 二进制编码格式进行数据传输。
    * TCompactProtocol – 这种协议非常有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
    * TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
    * TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
    * TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。

传输层
    * TSocket- 使用堵塞式I/O进行传输,也是最常见的模式。
    * TFramedTransport- 使用非阻塞方式,按块的大小,进行传输,类似于Java中的NIO。
    * TFileTransport- 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。
    * TMemoryTransport- 使用内存I/O,就好比Java中的ByteArrayOutputStream实现。
    * TZlibTransport- 使用执行zlib压缩,不提供Java的实现。

服务端类型
    * TSimpleServer -  单线程服务器端使用标准的堵塞式I/O。
    * TThreadPoolServer -  多线程服务器端使用标准的堵塞式I/O。
    * TNonblockingServer – 多线程服务器端使用非堵塞式I/O,并且实现了Java中的NIO通道。
 
谁在用thrift ?

Quara
     Thrift用于Quara系统后端数据的通信,服务端是用C++来实现的,客户端则是python。
Quara背景: Quara是在线问答服务公司,类似新浪微博和百度知道的合体,消息灵通人士透露,去年Quara获得了1400万美元投资,目前他们只有9名员工。
原文: http://www.philwhln.com/quoras-technology-examined#thrift

Evernote
  Thrift用于在多种Evernote API平台开发的客户端与Evernote服务器之间的通信与数据传输,Evernote API定义了自己的Evernote Data Access and Management (EDAM) 协议规范,让客户端使用更小的网络带宽上传、下载文件和在线即时搜索服务。
Evernote 背景: EverNote是一款非常著名的免费软件,它最大的特点就是支持多平台,而且数据能通过网络互相同步。譬如说,你可以随时在手机上的Evernote新增笔记,回家后在电脑上也能看到它了!
原文: http://www.evernote.com/about/developer/api/evernote-api.htm

HBase 中的Thrift
    Thrift用于HBase中是为了提供跨平台的服务接口,在HBase 中可以使用[hbase-root]/bin/hbase thrift start 命令启动涵盖Thrift的HBase服务端,客户端通过thrift的命令生成不同版本的客户端代码,根据定义的数据格式,对远程HBase服务端进行 操作,是除了REST远程方法调用的另一种途径。
参见:http://wiki.apache.org/hadoop/Hbase/ThriftApi

更多资料请阅读:http://wiki.apache.org/thrift/PoweredBy

Thrift与其他传输方式的比较
    xml与JSON相比体积太大,但是xml传统,也不算复杂。
    json 体积较小,新颖,但不够完善。
    thrift 体积超小,使用起来比较麻烦,不如前两者轻便,但是对于1.高并发、2.数据传输量大、3.多语言环境, 满足其中2点使用 thrift还是值得的。

  假定需要传输相同的内容,但使用不同的方式从 1、传输内容所产生的大小 2、传输过程中服务端和客户端所产生的开销,这2个方便进行比较。使用Thrift和其他方式的所产生的内容大小比较结果如下:
     thrift-size
    在上图中我们能明显看出,最臃肿的是RMI,其次是xml,使用Thrift的TCompactProtocol协议和Google 的 Protocol Buffers 相差的不算太多,相比而言还是Google 的 Protocol Buffers效果最佳。

使用Thrift 中的协议和其他方式的所产生的运行开销 比较结果如下:
  thrift-load

   在上图中我们能明显看出,最占资源是REST2中协议,使用Thrift的TCompactProtocol协议和Google 的 Protocol Buffers 相差的不算太多,相比而言Thrift的TCompactProtocol协议效果最佳。

分享到:
评论

相关推荐

    基于thrift的RPC调用实例

    在本实例中,我们将关注一个基于Thrift的RPC调用实现,Thrift是由Facebook开发的一种高效的跨语言服务开发框架。 Thrift的核心思想是定义一种中间描述文件(.thrift),该文件包含了服务接口、数据结构以及服务间的...

    基于Thrift的Golang与c#程序互相访问

    总的来说,通过Thrift,开发者可以在Golang和C#之间轻松构建高性能、跨语言的通信系统。理解Thrift的工作原理,熟悉其IDL语法,以及如何在Golang和C#中使用生成的代码,是实现这一目标的关键。在实际项目中,还需要...

    Thrift之QT远程调用(银河麒麟高级服务器版V10操作系统)

    在IT行业中,Thrift是一种高性能、可扩展的跨语言服务开发框架,主要用于构建分布式系统中的应用程序接口(API)。它的核心是定义了一种中间语言(IDL,Interface Definition Language),允许开发者在不同的编程...

    藏经阁-Thrift下的Node.js跨语言异构.pdf

    Thrift的主要优势在于其跨语言服务调用的能力。它通过定义服务接口描述文件,自动生成客户端和服务器端代码,使得在熟悉Thrift后,开发速度得到显著提升。Thrift的数据传输采用二进制格式,相比XML和JSON,体积更小...

    基于Thrift框架的数据交换方案_梁明炯.pdf

    Thrift确保客户端和服务器端的数据结构和接口一致,通过编译生成的代码实现跨语言的调用。 例如,在Java环境中,开发者首先定义数据结构和接口,然后使用Thrift IDL文件生成客户端和服务端的Java代码。服务端实现...

    thrift-0.9.2.exe

    总的来说,Thrift提供了一种高效、灵活的解决方案来构建分布式系统,通过使用IDL和自动生成的代码,可以大大简化跨语言通信的工作。在实际项目中,我们可以结合这个压缩包来学习如何设置Thrift服务,编写客户端和...

    thrift环境搭建(内附thrift运行环境可执行程序、搭建说明文本)

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年创建,并于2008年贡献给了Apache基金会。它通过定义一种中间语言(IDL,Interface Definition Language)来描述服务接口,允许开发者在不同的编程语言之间...

    一种基于Thrift的跨平台单点登录实现方法_韩冰.pdf

    【Thrift】Thrift是一种由Facebook开发的开源跨语言服务开发框架,它的主要目标是高效地连接不同编程语言之间的通信。Thrift通过定义接口描述语言(IDL)来规范服务的结构,然后自动生成多种编程语言的代码,使得...

    thrift初级入门教程

    无论是对于服务开发者还是最终用户而言,它都极大地简化了跨语言通信的过程。通过统一的数据类型和协议定义,Thrift 使得开发者能够在多种编程语言之间轻松构建和维护复杂的服务架构。 综上所述,Thrift 不仅仅是一...

    thrift代码生成工具和所需jar

    Thrift通过高效的二进制传输格式和异步/同步调用模式,确保了跨语言、跨平台的高效通信。 总的来说,Thrift是一个强大的工具,它简化了分布式系统开发中的通信难题,提供了统一的接口定义和代码生成机制,使得开发...

    php-hbase-thrift

    Thrift是一种跨语言的服务开发工具,由Facebook开源。它提供了一种接口定义语言(IDL)来定义服务,并自动生成支持这些服务的客户端和服务器端代码,使得不同编程语言之间可以进行高效、可靠的通信。Thrift的核心...

    thrift介绍与实践

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年设计并发布,后来成为Apache软件基金会的顶级项目。它旨在通过定义一种简单的接口定义语言(IDL)来解决分布式系统之间的通信问题,允许程序员在不同的...

    thrift-20070401

    Thrift 提供了一个中间表示层,它允许开发者定义一套跨语言的数据结构和服务接口。这些定义存储在一种称为 IDL(接口定义语言)的文件中。当开发者编写 IDL 文件时,Thrift 的代码生成工具会为选定的编程语言(如 ...

    thrift详解

    Thrift 是一个由 Facebook 开发并开源的软件框架,用于构建可扩展、跨语言的服务。其核心价值在于提供了一个统一的方法来定义数据类型和服务接口,从而使得不同编程语言之间能够无缝地进行通信。Thrift 的设计理念...

    c++,java跨语言通信

    在IT领域,跨语言通信是一项重要的技术,它允许不同编程语言之间进行数据交换和功能调用。本案例中,我们关注的是C++作为客户端与Java作为服务端的交互。这两种语言有着不同的特性和应用场景,但通过特定的技术和...

    facebook thrift

    ### Facebook Thrift:可扩展的跨语言服务实现 #### 概述 Facebook Thrift是一种软件库及一组代码生成工具,由Facebook开发,旨在加速高效、可扩展后端服务的开发与实施。其主要目标是通过将每种语言中通常需要...

    c# thrift demo

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年发布,旨在提供高效、灵活且可扩展的远程过程调用(RPC)解决方案。它允许开发者定义服务接口和服务数据类型,然后自动生成支持多种编程语言的客户端和...

    thrift入门学习教程

    这种方式使得开发者可以在不同的编程环境中实现相同的接口,从而实现跨语言的服务调用。 **2. 基础架构** Thrift的基础架构主要包括六个部分: - **业务逻辑实现**:这部分代码由开发者根据Thrift脚本自动生成,...

    php通过thrift获取hadoop资源

    Thrift是一种跨语言的服务开发工具,由Facebook开源,它允许用一种语言编写服务,然后在其他语言中使用这些服务。在这个场景下,PHP作为客户端,通过Thrift接口与Hadoop服务器端进行通信,实现了数据的读取和写入。 ...

Global site tag (gtag.js) - Google Analytics