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是瓶颈时,表现较好。