Thrift框架

  Thrift是一种开源的跨语言的RPC服务框架。Thrift最初由facebook公司开发的,在2007年facebook将其提交apache基金会开源。对于当时的facebook来说,创造Thrift是为了解决facebook系统中各系统间大数据量的传输通信,以及各系统之间语言环境不同而需要跨平台的特性。所以thrift可以支持多种程序语言,包括了C、C++、C#、Java、JavaScript、Python以及PHP等(当然不止这些)。在多种不同的语言之间通信Thrift可以作为二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。Thrift是IDL(interface definition language)描述性语言的一个具体实现,Thrift适用于程序对程序静态的数据交换,需要先确定好他的数据结构,他是完全静态化的,当数据结构发生变化时,必须重新编辑IDL文件,代码生成,再编译载入的流程,跟其他IDL工具相比较可以视为是Thrift的弱项,Thrift适用于搭建大型数据交换及存储的通用工具,对于大型系统中的子系统间数据传输相对于JSON和xml无论在性能、传输大小上有明显的优势。

 

                  图片来自网络

  如上图所示是Thrift的协议栈整体的架构,Thrift是一个客户端和服务器端的架构体系(C/S),在最上层是用户自行实现的业务逻辑代码。第二层是由Thrift编译器自动生成的代码,主要用于结构化数据的解析,发送和接收。TServer主要任务是高效的接受客户端请求,并将请求转发给Processor处理。Processor负责对客户端的请求做出响应,包括RPC请求转发,调用参数解析和用户逻辑调用,返回值写回等处理。从TProtocol以下部分是thirft的传输协议和底层I/O通信。TProtocol是用于数据类型解析的,将结构化数据转化为字节流给TTransport进行传输。TTransport是与底层数据传输密切相关的传输层,负责以字节流方式接收和发送消息体,不关注是什么数据类型。底层IO负责实际的数据传输,包括socket、文件和压缩数据流等。

 

  Thrift 脚本可定义的数据类型包括以下几种类型(以java中的类型为例):

  • 基本类型:
    • bool:布尔值,true 或 false,对应 Java 的 boolean
    • byte:8 位有符号整数,对应 Java 的 byte
    • i16:16 位有符号整数,对应 Java 的 short
    • i32:32 位有符号整数,对应 Java 的 int
    • i64:64 位有符号整数,对应 Java 的 long
    • double:64 位浮点数,对应 Java 的 double
    • string:未知编码文本或二进制字符串,对应 Java 的 String
  • 结构体类型:
    • struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
    • enum:定义公共的枚举。
  • 容器类型:
    • list:对应 Java 的 ArrayList
    • set:对应 Java 的 HashSet
    • map:对应 Java 的 HashMap
  • 异常类型:
    • exception:对应 Java 的 Exception
  • 服务类型:service:对应服务的类

 

协议层TProtocol:

在传输协议上总体上划分为文本(text)和二进制(binary)传输协议, 为节约带宽,提供传输效率,一般情况下使用二进制类型的传输协议为多数。

   1、TBinaryProtocol – 二进制编码格式进行数据传输。 

   2、TCompactProtocol – 高效的编码方式,使用类似于protobuffer的Variable-Length Quantity (VLQ) 编码(可以节省传输空间,使数据的传输效率更高)对数据进行压缩。

   3、TJSONProtocol – 使用JSON的数据编码协议进行数据传输。 

   4、TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析    

   5、TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。

传输层TTransport

    1、TSocket- 使用阻塞式I/O进行传输,也是最常见的模式。 

    2、TFramedTransport- 使用非阻塞方式,按块的大小,进行传输,类似于Java中的NIO。                

    3、TFileTransport- 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。 

    4、TMemoryTransport- 使用内存I/O,就好比Java中的ByteArrayOutputStream实现。 

    5、TZlibTransport- 使用执行zlib压缩,不提供Java的实现。

    6、TNonblockingTransport-使用非阻塞方式,用于构建异步客户端。

  服务端类型 :

    1、TSimpleServer -  单线程服务器端使用标准的阻塞式I/O。     

    2、TThreadPoolServer -  多线程服务器端使用标准的阻塞式I/O。 

    3、TNonblockingServer – 多线程服务器端使用非阻塞式I/O,并且实现了Java中的NIO通道。

 

以上是thrif的简介,以及对象和类型。

 

 

 

posted @ 2016-11-04 15:55  等待与憧憬  阅读(382)  评论(0)    收藏  举报