美文网首页
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学习

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