• 2016-01-19

    又在 wiki 上翻译了 Thrift - [IT]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/ma3r-logs/336939041.html

    Thrift

    Apache Thrift
    开发者 Apache软件基金会
    稳定版本 0.9.3(2015年10月6日,3个月前
    类型 远程过程调用框架
    许可协议 Apache许可证 2.0
    网站 thrift.apache.org

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

    1 架构

    Apache Thrift API CS架构

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

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

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

    支持的传输协议有:

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

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

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

    2 优点

    Thrift一些已经明确的优点包括:

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

    3 创建一个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

    4 参见

    5 参考文献

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

    6 外部链接

    分享到: