Apache Thrift

830 阅读3分钟

Thrift技术栈

protocol定义了消息序列化格式,transport定义了消息怎么在客户端和服务端通信,server用于从transport接收序列化的消息,根据protocol反序列化之,调用用户定义的消息处理器,并序列化消息处理器的响应,然后将他们写回transport中。

Thrift软件栈分层从下向上分别为:传输层(Transport Layer)、协议层(Protocol Layer)、处理层(Processor Layer)和服务层(Server Layer)。

  • 底层IO(underlying I/O):底层io,包括socket,http等一些方式。

  • 传输层(Transport Layer):传输层负责直接从网络中读取和写入数据,它定义了具体的网络传输协议;比如说TCP/IP传输等;支持阻塞式IO、非阻塞式IO等。

  • 协议层(Protocol Layer):协议层定义了数据传输格式,负责网络传输数据的序列化和反序列化;比如说JSON、XML、二进制数据等;支持各种数据的传输格式,如二进制、json、压缩格式等。

  • 处理层(Processor Layer):处理层是由具体的IDL(接口描述语言)生成的,封装了具体的底层网络传输和序列化方式,并委托给用户实现的Handler进行处理;通过thrift生成代码,用于结构化数据的解析、发送和接收。

  • 服务层(Server Layer):整合上述组件,提供具体的网络线程/IO服务模型,形成最终的服务;用户的业务逻辑代码。

Thrift数据类型

Thrift 脚本可定义的数据类型包括以下几种类型:

1.基本类型:

  • bool: 布尔值
  • byte: 8位有符号整数
  • i16: 16位有符号整数
  • i32: 32位有符号整数
  • i64: 64位有符号整数
  • double: 64位浮点数
  • string: UTF-8编码的字符串
  • binary: 二进制串

2.结构体类型:

  • struct: 定义的结构体对象

3.容器类型:

  • list: 有序元素列表
  • set: 无序无重复元素集合
  • map: 有序的key/value集合

4.异常类型:

  • exception: 异常类型

5.服务类型:

  • service: 具体对应服务的类

Thrift的协议

客户端和服务端之间的通信协议方式分为文本和二进制协议。

  • TBinaryProtocol:二进制编码格式进行数据传输
  • TCompactProtocol:高效率的、密集的二进制编码格式进行数据传输
  • TJSONProtocol: 使用JSON文本的数据编码协议进行数据传输
  • TSimpleJSONProtocol:只提供JSON只写的协议,适用于通过脚本语言解析

Thrift传输层

  • TSocket:使用阻塞式I/O进行传输,是最常见的模式
  • TNonblockingTransport:使用非阻塞方式,用于构建异步客户端
  • TFramedTransport:使用非阻塞方式,按块的大小进行传输,类似于Java中的NIO

Thrift服务端类型

  • TSimpleServer:单线程服务器端,使用标准的阻塞式I/O。每次只接受一个连接,在单线程处理连接请求。

  • TThreadPoolServer:多线程服务器端,使用标准的阻塞式I/O。专用的线程来接受连接,一旦接受连接就会调用ThreadPoolExecutor中的worker线程处理消息。

  • TNonblockingServer:单线程服务器端,使用非阻塞式I/O。调用了select方法,阻塞在多个连接上,java.nio.channels.Selector,可以同时服务多个连接上。

  • THsHaServer:半同步半异步服务器端,基于非阻塞式IO读写和多线程工作任务处理。一个selector线程处理网络连接io,一个worker线程池处理消息,只要有空闲的worker消息就会被处理。多条消息能被立即处理。

  • TThreadedSelectorServer:多线程选择器服务器端,对THsHaServer在异步IO模型上进行增强。两个线程池,一个处理网络IO,一个处理请求。当网络IO是瓶颈时,表现较好。

参考文献

Apache Thrift系列详解(一) - 概述与入门

Apache Thrift系列详解(二) - 网络服务模型

Apache Thrift系列详解(三) - 序列化机制

Spring Cloud整合Thrift RPC(一) - 使用指南

Spring Cloud整合Thrift RPC(二) - 应用案例