Thrift

Apache Thrift
開發者Apache软件基金会
当前版本
  • 0.20.0 (2024年3月22日;穩定版本)[1]
編輯維基數據鏈接
源代码库
  • git-wip-us.apache.org/repos/asf/thrift.git
編輯維基數據鏈接
类型远程过程调用框架
许可协议Apache许可证 2.0
网站thrift.apache.org

Thrift是一种接口描述语言和二进制通讯协议,[2]它被用来定义和创建跨语言的服务。[3]它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服务,可以使用C#、C++(基于POSIX兼容系统[4])、Cappuccino、[5]Cocoa、Delphi、Erlang、Go、Haskell、Java、Node.js、OCaml、PerlPHPPythonRubySmalltalk[6]虽然它以前是由Facebook开发的,但它现在是Apache软件基金会开源项目了。该实现被描述在2007年4月的一篇由Facebook发表的技术论文中,该论文现由Apache掌管。[7]

架构

Apache Thrift API CS架构

Thrift包含一套完整的栈来创建客户端和服务端程序。[8]顶层部分是由Thrift定义生成的代码。而服务则由这个文件客户端和处理器代码生成。在生成的代码里会创建不同于内建类型的数据结构,并将其作为结果发送。协议和传输层运行时库的一部分。有了Thrift,就可以定义一个服务或改变通讯和传输协议,而无需重新编译代码。除了客户端部分之外,Thrift还包括服务器基础设施来集成协议和传输,如阻塞、非阻塞及多线程服务器。栈中作为I/O基础的部分对于不同的语言则有不同的实现。

Thrift支持众多通讯协议:[8]

  • TBinaryProtocol – 一种简单的二进制格式,简单,但没有为空间效率而优化。比文本协议处理起来更快,但更难于调试
  • TCompactProtocol – 更紧凑的二进制格式,处理起来通常同样高效。
  • TDebugProtocol – 一种人类可读的文本格式,用来协助调试。
  • TDenseProtocol – 与TCompactProtocol类似,将传输数据的元信息剥离。
  • TJSONProtocol – 使用JSON对数据编码。
  • TSimpleJSONProtocol – 一种只写协议,它不能被Thrift解析,因为它使用JSON时丢弃了元数据。适合用脚本语言来解析。[9]

支持的传输协议有:

  • TFileTransport – 该传输协议会写文件。
  • TFramedTransport – 当使用一个非阻塞服务器时,要求使用这个传输协议。它按帧来发送数据,其中每一帧的开头是长度信息。
  • TMemoryTransport – 使用存储器映射输入输出。(Java的实现使用了一个简单的ByteArrayOutputStream。)
  • TSocket – 使用阻塞的套接字I/O来传输。
  • TZlibTransport – 用zlib执行压缩。用于连接另一个传输协议。

Thrift还提供众多的服务器,包括:

  • TNonblockingServer – 一个多线程服务器,它使用非阻塞I/O(Java的实现使用了NIO通道)。TFramedTransport必须跟这个服务器配套使用。
  • TSimpleServer – 一个单线程服务器,它使用标准的阻塞I/O。测试时很有用。
  • TThreadPoolServer – 一个多线程服务器,它使用标准的阻塞I/O。

优点

Thrift一些已经明确的优点包括:[來源請求]

  • 跟一些替代选择,比如SOAP相比,跨语言序列化的代价更低,因为它使用二进制格式。
  • 它有一个又瘦又干净的库,没有编码框架,没有XML配置文件。
  • 绑定感觉很自然。例如,Java使用java.util.ArrayList<String>C++使用std::vector<std::string>
  • 应用层通讯格式与序列化层通讯格式是完全分离的。它们都可以独立修改。
  • 预定义的序列化格式包括:二进制格式、对HTTP友好的格式,以及紧凑的二进制格式。
  • 兼作跨语言文件序列化
  • 协议使用软版本号机制软件版本管理[需要解释]。Thrift不要求一个中心化的和显式的版本号机制,例如主版本号/次版本号。松耦合的团队可以轻松地控制RPC调用的演进。
  • 没有构建依赖也不含非标准化的软件。不存在不兼容的软件许可证混用的情况。

创建一个Thrift服务

Thrift由C++编写,但可以为众多语言创建代码。要创建一个Thrift服务,必须写一些Thrift文件来描述它,为目标语言生成代码,并且写一些代码来启动服务器及从客户端调用它。下面就是一个这样的描述文件的代码示例:

enum PhoneType {
 HOME,
 WORK,
 MOBILE,
 OTHER
}

struct Phone {
 1: i32 id,
 2: string number,
 3: PhoneType type
}

Thrift将由这个描述信息生成独立的代码。例如,在Java里,PhoneType将是Phone类中一个简单的enum

参见

  • 自由软件主题
  • 数据序列化格式比较英语Comparison of data serialization formats
  • Apache Avro
  • ASN.1(抽象语法标记一)
  • Caucho的Hessian英语Hessian (Web service protocol)
  • GoogleProtocol Buffers
  • 外部数据表示法
  • ZeroC英语ZeroC的ICE
  • SDXF英语SDXF(结构化数据交换格式)

参考文献

  1. ^ Release 0.20.0. 2024年3月22日 [2024年4月19日]. 
  2. ^ 安装和使用Java下的Apache Cassandra第4部分(Thrift客户端). http://www.sodeso.nl/: Sodeso–软件开发解决方案. [2011-03-30]. (原始内容存档于2010-08-15). Thrift是一个独立的Apache项目,简单地说,就是一种二进制通讯协议。 (英文)
  3. ^ Andrew Prunicki. Apache Thrift:介绍. http://www.ociweb.com/: 对象计算有限公司–一家开放解决方案公司. [2011-04-11]. (原始内容存档于2011-07-23). 通过一种简单且直截了当的接口定义语言(IDL),Thrift允许你定义和创建一种服务,这种服务既可以用多种语言来实现,又可以由多种语言来使用。利用代码生成功能,Thrift可以创建一套文件,然后通过这套文件来创建服务端和客户端程序。除了互操作性之外,Thrift还非常高效,这得益于一套独特的、在时间和空间上都高效的序列化机制。 (英文)
  4. ^ Thrift的要求 (页面存档备份,存于互联网档案馆),要支持Windows参见这里 (页面存档备份,存于互联网档案馆(英文)
  5. ^ Fred Potter,使用Thrift + Cappuccino (页面存档备份,存于互联网档案馆),parallel48的甜美的邮件博客,2010年6月10日。(英文)
  6. ^ Andrew Prunicki. Apache Thrift:代码生成. http://www.ociweb.com/: 对象计算有限公司–一家开放解决方案公司. [2011-04-12]. (原始内容存档于2011-07-23). Thrift在不同程度上支持许多语言,完整的名单如下:(请小心,不能仅仅因为你的语言在某种程度上被支持,就假设它支持所有的Thrift特性。比如Python,仅支持TBinaryProtocol。)Cocoa、C++、C#、Erlang、Haskell、Java、OCaml、Perl、PHP、Python、Ruby和Smalltalk。 (英文)
  7. ^ Mark Slee、Aditya Agarwal、Marc Kwiatkowski,Thrift:大规模跨语言服务的实现 (页面存档备份,存于互联网档案馆(英文)
  8. ^ 8.0 8.1 Andrew Prunicki. Apache Thrift:介绍. http://www.ociweb.com/: 对象计算有限公司–一家开放解决方案公司. [2011-04-11]. (原始内容存档于2011-07-23). 该栈的顶层部分是从你的Thrift定义文件生成的代码。Thrift服务在生成的客户端和处理器代码中提供结果。在图中,这些是用棕色框表示的。被发送的数据结构(不同于内建类型)也由生成的代码产生。这些结果由红色框表示。通讯和传输协议是Thrift运行时库的一部分。因此,用Thrift,你可以定义一个服务,并可以自由地改变通讯和传输协议,而无需重新生成你的代码。Thrift还包括一个服务器基础设施,以集成各个通讯和传输协议。它支持阻塞、非阻塞、单线程以及多线程服务器。栈中“作为I/O基础”的部分则是因语言而异的。对于Java和Python网络I/O,Thrift库对其内建库起到了杠杆作用,而C++的实现使用了它自己的习惯。 (英文)
  9. ^ Skelton, Steven. 对开发者友好的Thrift请求日志. [2014年7月3日]. (原始内容存档于2014年7月14日). (英文)

外部链接

  • 官方网站(英文)
  • Thrift:缺失的指南(页面存档备份,存于互联网档案馆(英文)
  • Thrift蚂蚁任务(页面存档备份,存于互联网档案馆(英文)
  • Thrift指导(页面存档备份,存于互联网档案馆(英文)
顶级项目
  • Abdera英语Apache Abdera
  • Accumulo英语Apache Accumulo
  • ActiveMQ
  • Ambari英语Apache Ambari
  • Ant
  • Aries英语Apache Aries
  • Apache Arrow
  • Apache HTTP Server
  • APR
  • Avro
  • Axis
  • Axis2
  • Beam
  • Bloodhound英语Apache Bloodhound
  • Apache Brooklyn英语Apache Brooklyn
  • Buildr英语Apache Buildr
  • Calcite英语Apache Calcite
  • Camel
  • Cassandra
  • Cayenne英语Apache Cayenne
  • Chemistry英语Apache Chemistry
  • CloudStack英语Apache CloudStack
  • Cocoon英语Apache Cocoon
  • Continuum英语Apache Continuum
  • Cordova
  • CouchDB
  • cTAKES英语cTAKES
  • CXF
  • Deltacloud英语Deltacloud
  • Derby
  • Directory英语Apache Directory Server
  • Drill英语Apache Drill
  • Empire-db英语Apache Empire-db
  • ECharts
  • Felix英语Apache Felix
  • Flex
  • Flink
  • Flume英语Apache Flume
  • Forrest英语Apache Forrest
  • Geronimo英语Apache Geronimo
  • Gora英语Apache Gora
  • Gump英语Apache Gump
  • Hadoop
  • Hama英语Apache Hama
  • HBase
  • Hive
  • Jackrabbit英语Apache Jackrabbit
  • James英语Apache James
  • JMeter英语Apache JMeter
  • Kafka
  • Karaf英语Apache Karaf
  • Kylin英语Apache Kylin
  • Lucene
  • Lenya英语Apache Lenya
  • Mahout英语Apache Mahout
  • Marmotta英语Apache Marmotta
  • Maven
  • MINA英语Apache MINA
  • mod_perl英语mod_perl
  • MyFaces英语Apache MyFaces
  • Nutch英语Apache Nutch
  • ODE英语Apache ODE
  • OFBiz英语Apache OFBiz
  • Oozie英语Oozie
  • OpenEJB英语Apache OpenEJB
  • OpenJPA英语Apache OpenJPA
  • OpenNLP
  • OpenOffice
  • PDFBox英语Apache PDFBox
  • Phoenix英语Apache Phoenix
  • POI
  • Pig英语Pig (programming tool)
  • Pivot英语Apache Pivot
  • Qpid英语Apache Qpid
  • River英语Apache River
  • Roller英语Apache Roller
  • RocketMQ
  • Samza英语Apache Samza
  • ServiceMix英语Apache ServiceMix
  • Shindig英语Apache Shindig
  • Shiro
  • Sling英语Apache Sling
  • Spark
  • Stanbol英语Apache Stanbol
  • Storm
  • SpamAssassin
  • Sqoop
  • Apache C++标准库英语stdcxx
  • Struts
  • Struts 2
  • Subversion
  • Tapestry
  • Thrift
  • Tiles英语Apache Tiles
  • Tika英语Apache Tika
  • Tomcat
  • Trafficserver
  • Turbine
  • Tuscany
  • UIMA
  • Velocity
  • Wave
  • Wicket
  • Wink英语Apache Wink
  • Xalan英语Xalan
  • Xerces英语Xerces
  • XMLBeans英语XMLBeans
  • ZooKeeper
ASF logo
Commons项目
  • Apache Commons Logging英语Apache Commons Logging
  • BCEL英语Byte Code Engineering Library
  • BSF英语Bean Scripting Framework
  • Commons Daemon英语Commons Daemon
  • Jelly英语Apache Jelly
Lucene项目
  • Lucene Java
  • Lucene.Net英语Lucene.Net
  • Nutch英语Nutch
  • Solr
Hadoop项目
其他项目
  • Batik
  • Chainsaw英语Chainsaw (log file viewer)
  • FOP
  • Log4j
  • XAP英语Apache XAP
  • Log4Net
  • Ivy英语Apache Ivy
孵化器项目
  • XAP英语Apache XAP
  • Samza英语Apache Samza
  • Storm
Apache Attic
  • AxKit英语AxKit
  • Beehive英语Apache Beehive
  • Click英语Apache Click
  • Apache BlueSky英语BlueSky Open Platform
  • Cactus英语Jakarta Cactus
  • Jakarta
  • Excalibur英语Apache Excalibur
  • Harmony
  • HiveMind英语Apache HiveMind
  • Lenya英语Apache Lenya
  • Slide英语Jakarta Slide
  • Shale英语Apache Shale
  • Shindig英语Apache Shindig
  • stdcxx英语Apache C++ Standard Library
  • iBATIS
  • XMLBeans英语XMLBeans
许可证标准
  • 分类 分类
  • 共享资源页面 维基共享
Meta Platforms
  • 历史英语History of Facebook
  • 年表
  • 收購
  • 批評
    • 实名制争议
Facebook
  • 功能英语Facebook features
  • Beacon英语Facebook Beacon
  • 图谱搜索英语Facebook Graph Search
  • EdgeRank英语EdgeRank
  • 平臺
  • 虚拟货币英语Facebook Credits
  • 赞按钮英语Like button#Use on Facebook
  • 洋葱地址
其他产品
過往產品
  • FriendFeed
  • Home
  • M(虛擬助理)英语M (virtual assistant)
  • Onavo英语Onavo
  • Facebook Paper英语Facebook Paper
  • Facebook Slingshot英语Facebook Slingshot
  • tbh英语tbh (app)
  • Wirehog英语Wirehog
人物
创始人
董事会
执行首长
当前
过去
  • 西恩·帕克4%, 原有
  • 欧文·范·纳塔英语Owen Van Natta
  • 吉迪昂·余英语Gideon Yu
  • 亚当·安捷罗英语Adam D'Angelo
  • 克里斯·凯利英语Chris Kelly (entrepreneur)
  • 布莱特·泰勒英语Bret Taylor
著名员工
当前
  • 克里斯·考克斯(产品副总裁)
  • 埃利奥特·施拉格英语Elliot Schrage(全球通信,营销和公共政策副总裁)
  • 拉尔斯·拉斯穆森英语Lars Rasmussen (software developer)(圖譜搜尋總監)
  • 約翰·卡馬克 (Oculus VR 首席科技官)
  • 耐奥米·格雷特英语Naomi Gleit (社会进步副总裁)
  • Caryn Marooney (通信副总裁)
过去
开源项目
  • FQL英语Facebook Query Language
  • HipHop for PHP
  • Scribe英语Scribe (log server)
  • Open Compute Project英语Open Compute Project
大众传媒
  • The Facebook Effect英语The Facebook Effect
  • The Accidental Billionaires英语The Accidental Billionaires
  • 社交网络
概念
  • 活动流英语Activity stream
  • 社交图英语Social graph
  • 好友
  • 转发英语Reblogging
  • Fan-gating英语Fan-gating
  • Facebook 外交
  • 讚按鈕英语Facebook Like button
相關
  • 使用Facebook的调查英语Use of social network websites in investigations#Facebook
  • 审查
  • Category:Facebook诉讼英语Category:Facebook litigation
  • F8开发者大会
  • IPO英语Initial public offering of Facebook