Thrift学习(1)-Thrift简介

来源:互联网 发布:理性消费 知乎 编辑:程序博客网 时间:2024/05/04 18:09

Thrift简介

Thrift是什么

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

Thrift基础框架

thrift基础框架如图所示:

thrift基础框架

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

协议层TProtocol

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

  • TBinaryProtocol – A straightforward binary format, simple, but not optimized for space efficiency. Faster to process than the text protocol but more difficult to debug.
  • TCompactProtocol – More compact binary format; typically more efficient to process as well
  • TDebugProtocol – A human-readable text format to aid in debugging
  • TDenseProtocol – Similar to TCompactProtocol, stripping off the meta information from what is transmitted.
  • TJSONProtocol – Uses JSON for encoding of data.
  • TSimpleJSONProtocol – A write-only protocol that cannot be parsed by Thrift because it drops metadata using JSON. Suitable for parsing by scripting languages

传输层TTransport

thrift支持的传输方式包括:

  • TFileTransport – This transport writes to a file.
  • TFramedTransport – This transport is required when using a non-blocking server. It sends data in frames, where each frame is preceded by length information.
  • TMemoryTransport – Uses memory for I/O. The Java implementation uses a simple ByteArrayOutputStream internally.
  • TSocket – Uses blocking socket I/O for transport.
  • TZlibTransport – Performs compression using zlib. Used in conjunction with another transport.

服务类型

Thrift提供了三种不同类型的服务

  • TNonblockingServer
    TNonblockingServer提供一个单独的线程处理网络IO,同时该线程也负责处理client端的请求。同时,TNonblockingServer创建一个分离的工作线程池(worker threads pool)处理请求。对于每一个请求,不需要新建一个单独的线程进行处理。通过TNonblockingServer能使用较少数量的线程数处理大规模的并发请求。

  • TThreadedServer
    TThreadedServer类型的服务为每一个客户端请求创建一个新线程对请求进行处理,该线程的生命周期直到客户端请求断开。使用TThreadedServer类型的服务当处理10000个并发请求时,需要同时创建10000个线程对每一个请求进行处理。

  • TThreadPoolServer
    TThreadPoolServer服务和TThreadedServer类似,每一个客户端请求获取一个自己独享的处理线程。但是它和TThreadedServer相比有一下不同点:

    • 每一个客户端请求断开会,该请求的处理线程不会结束,而是放到一个线程池中,在接收到新的客户端请求时,可重复使用线程池中的处理线程
    • 处理线程的数量有限制,当接收到新的客户端请求但是处理线程数量已经到达处理线程上限时,该客户端请求会被挂起

Thrift数据类型

Thrift支持多种数据类型,处理支持基本数据类型以外,还支持一些结构图、容器等复杂类型。

基本类型

  • 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

容器类型

  • list:对应 Java 的 ArrayList
  • set:对应 Java 的 HashSet
  • map:对应 Java 的 HashMap

异常类型

  • exception:对应 Java 的 Exception
0 0
原创粉丝点击