架构图
Thrift组件
- TTransport 传输组件
- TProtocol 协议和编解码组件
- TProcessor 服务调用组件
- TServer,Client 服务器和客户端组件
- IDL 服务描述组件,负责生产跨平台客户端
IDL组件
namespace java com.thrift.test
struct Parameter{
1: required i32 id;
2: required string name;
}
service DemoService{
i32 demoMethod(1:string param1, 2:Parameter param2, 3:map<string,string> param3);
}
执行命令
thrift -r --gen java demo.thrift
生成结果
- 接口类型,默认名称都是Iface。这个接口类型被服务器和客户端共同使用。
自动生成的接口有两个,一个是同步调用的Iface,一个是异步调用的AsyncIface。异步调用的接口多了一个回调参数。 - 客户端类型,一个同步调用Client,一个异步调用AsyncClient
- Processor,用来支持方法调用,每个服务的实现类都要使用Processor来注册,这样最后服务器端调用接口实现时能定位到具体的实现类。
4.方法参数的封装类,以"方法名_args"命名。
5.方法返回值的封装类,以"方法名_result"命名。
TProcessor组件
TProcessor负责对Client的请求做出相应,包括RPC请求转发,调用参数解析和用户逻辑调用,返回值写回等处理步骤。Processor是服务器端从Thrift框架转入用户逻辑的关键流程。Processor同时也负责向Message结构中写入数据或者读出数据。
TProtocol组件
TProtocol负责把TTransport中的字节流转化为数据流,并定义了具体的转换格式。TProtocol主要做两件事: 1) 双向有序的消息传递; 2) 基本类型、容器及结构体的编码。
- TBinaryProtocol:二进制格式
- TCompactProtocol: 高效率的、密集的二进制编码格式
- TJSONProtocol:使用JSON的数据编码协议进行数据传输
- TSimpleJSONProtocol:提供JSON只写协议,生成的文件很容易通过脚本语言解析
- TDebugProtocol:使用易懂的可读的文本格式,以便于debug
TTransport组件
TTransport是与底层数据传输紧密相关的传输层。每一种支持的底层传输方式都存在一个与之对应的TTransport。在TTransport这一层,数据是按字节流(Byte Stream)方式处理的,即传输层看到的是一个又一个的字节,并把这些字节按照顺序发送和接收。TTransport并不了解它所传输的数据是什么类型,实际上传输层也不关心数据是什么类型,只需要按照字节方式对数据进行发送和接收即可。数据类型的解析在TProtocol这一层完成。
- TSocket:使用阻塞的TCP Socket进行数据传输,也是最常见的模式
- THttpTransport:采用Http传输协议进行数据传输
- TFileTransport:文件(日志)传输类,允许client将文件传给server,允许server将收到的数据写到文件中
-
TZlibTransport:与其他的TTransport配合使用,压缩后对数据进行传输,或者将收到的数据解压
下面几个类主要是对上面几个类地装饰(采用了装饰模式),以提高传输效率。 - TBufferedTransport:对某个Transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或者将数据直接写入buffer
- TFramedTransport:同TBufferedTransport类似,也会对相关数据进行buffer,同时,它支持定长数据发送和接收(按块的大小,进行传输)。
- TMemoryBuffer:从一个缓冲区中读写数据。
TServer组件
TServer在Thrift框架中的主要任务是接收Client的请求,并转到某个TProcessor上进行请求处理。针对不同的访问规模,Thrift提供了不同的TServer模型。Thrift目前支持的Server模型包括:
- TSimpleServer:使用阻塞IO的单线程服务器,循环监听新请求的到来并完成对请求的处理,主要用于调试。
- TThreadPoolServer:通过线程池的方式来处理请求,线程池使用了SynchronousQueue同步队列,主线程一直循环接收请求,接收到请求时将请求封装为WorkerProcess抛给线程池来处理。
- TNonblockingServer:单线程非阻塞的模式,借助Channel/Selector机制。所有的socket都会被注册到selector上,在一个线程循环监控所有的socket。每次selector完成一次select,就会将已就绪的socket取出来进行处理。
-
THsHaServer:继承了TNonBlockingServer,并通过线程池来提高任务处理的并发能力。THsHaServer是半同步半异步的处理模式,Half-Sync用于IO事件处理(Accept/Read/Write),Half-Async用于业务handler对rpc的同步处理上。
半同步:通过SelectAcceptThread线程同步轮询IO就绪事件,调用就绪的channel来accept,read,write事件。
半异步:将上述事件的调用封装成一个Runnale交给线程池执行,而同步轮询的SelectAcceptThread线程中直接返回进行下一轮轮询。 -
TThreadedSelectorServer:是目前Thrift提供的最高级的模式,它内部有如果几个部分构成:
- 一个AcceptThread线程对象,专门用于处理监听socket上的新连接;
- 若干个SelectorThread对象专门用于处理业务socket的网络I/O操作,所有网络数据的读写均是有这些线程来完成;
- 一个负载均衡器SelectorThreadLoadBalancer对象,主要用于AcceptThread线程接收到一个新socket连接请求时,决定将这个新连接请求分配给哪个SelectorThread线程。
- 一个ExecutorService类型的工作线程池,在SelectorThread线程中,监听到有业务socket中有调用请求过来,则将请求读取之后,交个ExecutorService线程池中的线程完成此次调用的具体执行。
TServer对象通常如下工作:
- 使用TServerTransport获得一个TTransport
- 使用TTransportFactory,可选地将原始传输转换为一个适合的应用传输(典型的是使用TBufferedTransportFactory)
- 使用TProtocolFactory,为TTransport创建一个输入和输出
- 调用TProcessor对象的process()方法
网友评论