fbpx
维基百科

Thrift

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

Apache Thrift
開發者Apache软件基金会
当前版本
  • 0.19.0 (2023年9月2日;穩定版本)[1]
源代码库
  • git-wip-us.apache.org/repos/asf/thrift.git
类型远程过程调用框架
许可协议Apache许可证 2.0
网站thrift.apache.org

架构 编辑

 
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英语ZeroCICE
  • SDXF英语SDXF(结构化数据交换格式)

参考文献 编辑

  1. ^ Release 0.19.0. 2023年9月2日 [2023年9月18日]. 
  2. ^ . 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指导(页面存档备份,存于互联网档案馆(英文)

thrift, 是一种接口描述语言和二进制通讯协议, 它被用来定义和创建跨语言的服务, 它被当作一个远程过程调用, 框架来使用, 是由facebook为, 大规模跨语言服务开发, 而开发的, 它通过一个代码生成引擎联合了一个软件栈, 来创建不同程度的, 无缝的跨平台高效服务, 可以使用c, 基于posix兼容系统, cappuccino, cocoa, delphi, erlang, haskell, java, node, ocaml, perl, python, ruby和smalltalk, 虽然它以前是由f. Thrift是一种接口描述语言和二进制通讯协议 2 它被用来定义和创建跨语言的服务 3 它被当作一个远程过程调用 RPC 框架来使用 是由Facebook为 大规模跨语言服务开发 而开发的 它通过一个代码生成引擎联合了一个软件栈 来创建不同程度的 无缝的跨平台高效服务 可以使用C C 基于POSIX兼容系统 4 Cappuccino 5 Cocoa Delphi Erlang Go Haskell Java Node js OCaml Perl PHP Python Ruby和Smalltalk 6 虽然它以前是由Facebook开发的 但它现在是Apache软件基金会的开源项目了 该实现被描述在2007年4月的一篇由Facebook发表的技术论文中 该论文现由Apache掌管 7 Apache Thrift開發者Apache软件基金会当前版本0 19 0 2023年9月2日 穩定版本 1 源代码库git wip us wbr apache wbr org wbr repos wbr asf wbr thrift wbr git类型远程过程调用框架许可协议Apache许可证 2 0网站thrift wbr apache wbr org 目录 1 架构 2 优点 3 创建一个Thrift服务 4 参见 5 参考文献 6 外部链接架构 编辑 nbsp 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 lt String gt C 使用std vector lt std string gt 应用层通讯格式与序列化层通讯格式是完全分离的 它们都可以独立修改 预定义的序列化格式包括 二进制格式 对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 参见 编辑 nbsp 自由软件主题 数据序列化格式比较 英语 Comparison of data serialization formats Apache Avro ASN 1 抽象语法标记一 Caucho的Hessian 英语 Hessian Web service protocol Google的Protocol Buffers 外部数据表示法 ZeroC 英语 ZeroC 的ICE SDXF 英语 SDXF 结构化数据交换格式 参考文献 编辑 Release 0 19 0 2023年9月2日 2023年9月18日 安装和使用Java下的Apache Cassandra第4部分 Thrift客户端 http www sodeso nl Sodeso 软件开发解决方案 2011 03 30 原始内容存档于2010 08 15 Thrift是一个独立的Apache项目 简单地说 就是一种二进制通讯协议 英文 Andrew Prunicki Apache Thrift 介绍 http www ociweb com 对象计算有限公司 一家开放解决方案公司 2011 04 11 原始内容存档于2011 07 23 通过一种简单且直截了当的接口定义语言 IDL Thrift允许你定义和创建一种服务 这种服务既可以用多种语言来实现 又可以由多种语言来使用 利用代码生成功能 Thrift可以创建一套文件 然后通过这套文件来创建服务端和客户端程序 除了互操作性之外 Thrift还非常高效 这得益于一套独特的 在时间和空间上都高效的序列化机制 英文 Thrift的要求 页面存档备份 存于互联网档案馆 要支持Windows参见这里 页面存档备份 存于互联网档案馆 英文 Fred Potter 使用Thrift Cappuccino 页面存档备份 存于互联网档案馆 parallel48的甜美的邮件博客 2010年6月10日 英文 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 英文 Mark Slee Aditya Agarwal Marc Kwiatkowski Thrift 大规模跨语言服务的实现 页面存档备份 存于互联网档案馆 英文 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 的实现使用了它自己的习惯 英文 Skelton Steven 对开发者友好的Thrift请求日志 2014年7月3日 原始内容存档于2014年7月14日 英文 外部链接 编辑官方网站 英文 Thrift 缺失的指南 页面存档备份 存于互联网档案馆 英文 Thrift蚂蚁任务 页面存档备份 存于互联网档案馆 英文 Thrift指导 页面存档备份 存于互联网档案馆 英文 取自 https zh wikipedia org w index php title Thrift amp oldid 70393458, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。