zoukankan      html  css  js  c++  java
  • Thrift 基础

    1.前言

        Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言 (IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现。

        Thrift与我曾经使用过的ICE很像。ICE是由Zeroc公司开发的网络通信引擎。ICE框架除了完成跨语言调用之外,它提供的服务发布和注册功能(使用ICE registry),pub-sub通信模式,用于更新部署的软件的ICE patch和用于处理跨路由器的ICE glacier 是thrift没有的,这些额外的功能使得用户能更方便的开发自己的私有云服务平台。可以说,ICE比thrift更高一个层次。但是,个人不太喜欢它的很多实现,它们很多功能使用起来都不是很方便。(ICE 3.3.0)

        相反而言,另一个与Thrift有关系的开源项目是ZeroMQ。这个项目我个人十分看好,有望进入Linux 内核。ZeroMQ原先制定的目标为AMQ,但是做着做着慢慢演变成通信库了。它精于进程内,进程间,网络,和多播通信,提供了多种多样的通信模式,最大的特点是快(大量使用直接的内存拷贝),安全(通信双方均有消息缓存队列)。与Thrift相比,ZeroMQ低了一个层次,通信双方需要自己做序列化工作,而且没有直接提供rpc功能。

        Thrift有两个目标,跨语言通信和提供rpc功能。

    2.架构

       

                                

    Thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语 言的支持。用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服 务)便可以了。其中protocol(协议层, 定义数据传输格式,可以为二进制或者XML等)和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用 作运行时库。

    3、 支持的数据传输格式、数据传输方式和服务模型

    (1)支持的传输格式

    TBinaryProtocol – 二进制格式.

    TCompactProtocol – 压缩格式

    TJSONProtocol – JSON格式

    TSimpleJSONProtocol –提供JSON只写协议, 生成的文件很容易通过脚本语言解析。

    TDebugProtocol – 使用易懂的可读的文本格式,以便于debug

    (2) 支持的数据传输方式

    TSocket -阻塞式socker

        提供了一个通用,简单的TCP/IP流socket。

    TFramedTransport – 以frame为单位进行传输,非阻塞式服务中使用。

    TFileTransport – 以文件形式进行传输。

    TMemoryTransport – 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream。

    TZlibTransport – 使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。

    (3)支持的服务模型

    TSimpleServer – 简单的单线程服务模型,常用于测试

    TThreadPoolServer – 多线程服务模型,使用标准的阻塞式IO。

    TNonblockingServer – 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)

    参考资料

    http://dongxicheng.org/search-engine/thrift-framework-intro/

       

  • 相关阅读:
    洛谷 P1908 逆序对(树状数组解法)
    洛谷 P1908 逆序对(归并排序解法)
    洛谷 P3368 【模板】树状数组 2(区间修改点查询)
    POJ 2833 The Average(优先队列)
    POJ 2255 Tree Recoveryw(二叉树)
    洛谷 P1540 机器翻译(队列)
    POJ 1686 Lazy Math Instructor(栈)
    队列中取最大值操作
    相邻元素差的绝对值都是1,在这样的数组中找目标元素
    双栈队列实现快速获取队列最大值最小值
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2437726.html
Copyright © 2011-2022 走看看