Thrift学习

架构图


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

生成结果


  1. 接口类型,默认名称都是Iface。这个接口类型被服务器和客户端共同使用。
    自动生成的接口有两个,一个是同步调用的Iface,一个是异步调用的AsyncIface。异步调用的接口多了一个回调参数。
  2. 客户端类型,一个同步调用Client,一个异步调用AsyncClient
  3. 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提供的最高级的模式,它内部有如果几个部分构成:
    1. 一个AcceptThread线程对象,专门用于处理监听socket上的新连接;
    2. 若干个SelectorThread对象专门用于处理业务socket的网络I/O操作,所有网络数据的读写均是有这些线程来完成;
    3. 一个负载均衡器SelectorThreadLoadBalancer对象,主要用于AcceptThread线程接收到一个新socket连接请求时,决定将这个新连接请求分配给哪个SelectorThread线程。
    4. 一个ExecutorService类型的工作线程池,在SelectorThread线程中,监听到有业务socket中有调用请求过来,则将请求读取之后,交个ExecutorService线程池中的线程完成此次调用的具体执行。

TServer对象通常如下工作:

  1. 使用TServerTransport获得一个TTransport
  2. 使用TTransportFactory,可选地将原始传输转换为一个适合的应用传输(典型的是使用TBufferedTransportFactory)
  3. 使用TProtocolFactory,为TTransport创建一个输入和输出
  4. 调用TProcessor对象的process()方法

参考

Thrift源码分析系列
Thrift由浅入深
Thrift RPC详
Thrift TServer模型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Thrift源码剖析 Thrift源码分析及一个完整的例子 CSDN Thrift源码分析 Thrift二进制序列...
    无善无恶阅读 5,441评论 0 1
  • 简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以...
    ssochi阅读 2,299评论 0 2
  • Thrift是什么? Thrift是Facebook于2007年开发的跨语言的rpc服框架,提供多语言的编译功能,...
    jiangmo阅读 13,173评论 0 6
  • 上接:thrift 入门(1/2)PS:我也不想拆,但是放一起文章太长无法发布。。。 四、thrift 入门 4....
    李眼镜阅读 4,849评论 0 1
  • Apache Thrift是FaceBook实现的一种高效的、支持多语言的远程服务调用框架。其主要功能是通过自定义...
    gfgao阅读 2,669评论 0 0

友情链接更多精彩内容