Thrift

Thrift是一种接口描述语言和二进制通讯协议，它被用来定义和创建跨语言的服务。它被当作一个远程过程调用（RPC）框架来使用，是由Facebook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈，来创建不同程度的、无缝的跨平台高效服务，可以使用C#、C++（基于POSIX兼容系统）、Cappuccino、Cocoa、Delphi、Erlang、Go、Haskell、Java、Node.js、OCaml、Perl、PHP、Python、Ruby和Smalltalk。虽然它以前是由Facebook开发的，但它现在是Apache软件基金会的开源项目了。该实现被描述在2007年4月的一篇由Facebook发表的技术论文中，该论文现由Apache掌管。 Thrift包含一套完整的栈来创建客户端和服务端程序。顶层部分是由Thrift定义生成的代码。而服务则由这个文件客户端和处理器代码生成。在生成的代码里会创建不同于内建类型的数据结构，并将其作为结果发送。协议和传输层是运行时库的一部分。有了Thrift，就可以定义一个服务或改变通讯和传输协议，而无需重新编译代码。除了客户端部分之外，Thrift还包括服务器基础设施来集成协议和传输，如阻塞、非阻塞及多线程服务器。栈中作为I/O基础的部分对于不同的语言则有不同的实现。 Thrift支持众多通讯协议： TBinaryProtocol – 一种简单的二进制格式，简单，但没有为空间效率而优化。比文本协议处理起来更快，但更难于调试。 TCompactProtocol – 更紧凑的二进制格式，处理起来通常同样高效。 TDebugProtocol – 一种人类可读的文本格式，用来协助调试。 TDenseProtocol – 与TCompactProtocol类似，将传输数据的元信息剥离。 TJSONProtocol – 使用JSON对数据编码。 TSimpleJSONProtocol – 一种只写协议，它不能被Thrift解析，因为它使用JSON时丢弃了元数据。适合用脚本语言来解析。 支持的传输协议有： 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由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)） Google的Protocol Buffers 外部数据表示法 ZeroC（英语：ZeroC）的ICE SDXF（英语：SDXF）（结构化数据交换格式） 安装和使用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：大规模跨语言服务的实现 （页面存档备份，存于互联网档案馆）（英文） 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指导（页面存档备份，存于互联网档案馆）（英文）