RPC调用流程
|
|

Thrift主要特点
- 基于二进制的高性能的编解码框架
- 基于NIO的底层通信
- 相对简单的服务调用模型
- 使用IDL支持跨平台调用
Thrift核心组件
TProtocol协议和编解码组件TTransport传输组件TProcessor服务调用组件TServer,Client服务器和客户端组件- IDL 服务描述组件,负责生产跨平台客户端
Thrift基础架构

thrift是一个客户端和服务器端的架构体系(c/s),在最上层是用户自行实现的业务逻辑代码。第二层是由thrift编译器自动生成的代码,主要用于结构化数据的解析,发送和接收。TServer主要任务是高效的接受客户端请求,并将请求转发给Processor处理。Processor负责对客户端的请求做出响应,包括RPC请求转发,调用参数解析和用户逻辑调用,返回值写回等处理。从TProtocol以下部分是thirft的传输协议和底层I/O通信。TProtocol是用于数据类型解析的,将结构化数据转化为字节流给TTransport进行传输。TTransport是与底层数据传输密切相关的传输层,负责以字节流方式接收和发送消息体,不关注是什么数据类型。底层IO负责实际的数据传输,包括socket、文件和压缩数据流等。
传输层TTransport
TIOStreamTransport: 这个类封装了InputStream和OutputStream这两个流,用来处理数据传输中的输入输出流。采用的是阻塞同步IO。TSocket: 是TIOStreamTransport类的子类,并且封装了Socket接口。
TNonblockingTransport: 这个类是非阻塞IO的抽象类。TNonblockingSocket: 是TNonblockingTransport类的子类,使用了SocketChannel进行了非阻塞IO。
TFramedTransport: 使用非阻塞方式,帧传输类就是按照一帧的固定大小来传输数据,所有的写操作首先都是在内存中完成的直到调用了flush操作,然后传输节点在flush操作之后将所有数据根据数据的有效载荷写入数据的长度的二进制块发送出去,允许在接收的另一端按照固定的长度来读取。
|
|
阻塞TSocket
|
|
非阻塞TFramedTransport
- 流程图

- 源码分析
|
|
TFramedTransport封装了TMemoryInputTransport做输入流,封装了TByteArryOutPutStream做输出流,作为内存读写缓冲区的一个封装。TFramedTransport的flush方法时,会先写4个字节的输出流的长度作为消息头,然后写消息体;和FrameBuffer的读消息对应起来,FrameBuffer 读消息时,先读4个字节的长度,再读消息体。
|
|
协议层TProtocol
TBinaryProtocol:二进制编码格式进行数据传输。TCompactProtocol:高效的编码方式,对数据进行压缩。TJSONProtocol:使用JSON的数据编码协议进行数据传输。