美文网首页
Thrift学习

Thrift学习

作者: 一蓬蒿人 | 来源:发表于2020-02-22 11:47 被阅读0次

架构图


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模型

相关文章

  • 从零开始学习Thrift之一——了解Thrift

    从零开始学习Thrift之一——了解Thrift 1. What is Thrift 上面是官方给出的介绍,简单...

  • thrift 简介三

    thrift 使用之前我们看了一些thrift的概念,现在我们通过hello world来学习thrift的使用。...

  • Thrift学习

    Thrift源码剖析 Thrift源码分析及一个完整的例子 CSDN Thrift源码分析 Thrift二进制序列...

  • Thrift学习

    架构图 Thrift组件 TTransport 传输组件 TProtocol 协议和编解码组件 TProcesso...

  • thrift 学习日记一

    Apache Thrift 学习日记 开始正式学习thrift,今天是第一天,先看看官网文档 http://thr...

  • Thritf 学习笔记

    本文为学习记录,如有侵权,请联系删除 为何需要使用Thrift协议? 首先,Thrift是基于socket的,通过...

  • Thirft

    一、About thrift二、什么是thrift,怎么工作?三、Thrift IDL四、Thrift D...

  • Docker&k8s微服务学习实践(二)

    一、下载配置thrift 从Thrift官网 http://thrift.apache.org/ 下载thrift...

  • thrift学习记录

    简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以...

  • 简单学习Thrift

    thrift是一个RPC框架,一般用于提供远程接口调用的,也就是作为服务器供其他的客户端调用,这个客户端也可以是指...

网友评论

      本文标题:Thrift学习

      本文链接:https://www.haomeiwen.com/subject/nxqlqhtx.html