Thrift 源码分析(一)基本概念

英语不好气死人啊,thrift官方文档写得很好,就是全英文看起来有点吃力。先把一些关键字列出来解释一下,怕自己以后忘记了。因为对C#熟悉一些,以下都是根据C#源码写的。
看源码和官方文档是一个好习惯,一定要坚持!!!
Thrift最重要的三个东西:TTransport(I/O层)、TProtocol(数据封装协议层)、TProcessor(服务端请求处理器)。
TTransport告诉我们写到哪里去、从哪里读;TProtocol告诉我们数据怎么包装,如何进行序列化和反序列化;TProcessor提供面向对象的数据处理接口(代码自动生成,需要自己实现iface/ISync进行数据处理)。这三者就像送快递:

  1. client调用生成的接口,TProtocol把数据和目标接口打包
  2. Transport把数据发给TServerTransport
  3. TServerTransport告知对应的TProcess开始分拣数据
  4. TProcess从TServerTransport中读取数据头,找到要发送的目标接口
  5. TProcess通知目标接口有调用
  6. 目标接口调用InProrotocol读取剩下的数据,解析后调用Handle
  7. Handle的返回值通过OutProtocol写回TServerTransport,最终返回给client

这里写图片描述

TTransport 传输层/读写抽象层
这是一个最基础的数据读写抽象层,使数据读写从其他thrift部分分离解耦。读写抽象层分三块,一块是client端读写抽象层,一部分是服务端读写抽象层,还有一个读写抽象工厂。
1. TTransport 客户端读写抽象层

它的子类有很多实现
1.1 TBufferTransport
实现数据缓存
thrift之TTransport层的缓存传输类TBufferedTransport和缓冲基类TBufferBase
1.2 TFramedTransport
1.3 THttpClient
1.4 TMemoryBuffer
1.5 TNamedPipeClientTransport
1.7 TStreamTransport
1.8 TSocket
TSocket继承自TStreamTransport,是一个TCP网络传输的流式读写实现。
1.9 TTLSSocket
TTLSSocket继承自TStreamTransport,SSL Socket包装类。
2 TServerTransport 服务端读写抽象层
用于服务端的读写抽象层
2.1 TServerSocket
继承自TServerTransport,socket读写实现
2.2 TTLSServerSocket
继承自TServerTransport,SSL Socket读写实现
2.3 TNamedPipeServerTransport
3 TTransportFactory 读写抽象层工厂
这个类里面就只有一个一个虚方法:

        public virtual TTransport GetTransport(TTransport trans)
        {
            return trans;
        }

TFramedTransport.Factory继承自此类。
TProcotol 数据封包
将数据映射成可传输的格式,给出编码机制并对数据进行序列化和反序列化。

TBinaryProtocol
二进制封包
TCompactProtocol
协议封包、契约
TJSONProtocol
json格式封包
以下两个我还没搞清楚:
TProtocolDecorator
和装饰模式有关
TMultiplexedProtocol:TProtocolDecorator
多路复用,一个socket调用两个service需要使用到
TProcotolFactory 接口
接口里面就一个需要实现的方法:

   TProtocol GetProtocol(TTransport trans);

TBinaryProtocol、TCompactProtocol、TJSONProtocol都实现了自己的TProcotolFactory 接口。

TProcessor
封装了从输入数据流中读数据和向数据流中写数据的操作,读写数据用TProtocol对象表示
主要工作流程:

  1. 从连接中读取数据(使用输入TProtocol iprot)
  2. 将处理授权给handler(由用户实现)
  3. 最后将结果写到连接上(使用 TProtocol oprot)
    TMultiplexedProcessor

TProcessorFactory 接口
里面就一个需要实现的方法:

   TProcessor GetProcessor(TTransport trans, TServer server = null);

在Thrift中有一个实现TSingletonProcessorFactory,默认使用的都是这个实现。
Thrift 双向通信实现(C#版)中我们实现了一个TProcessorFactory。
还有一个泛型实现:TPrototypeProcessorFactory
TServer
将TProtocol、TTransport、TProcessor组合在一起,构成thrift服务端

  1. 创建一个transport对象
  2. 位transport对象创建输入输出protocol
  3. 基于输入输出创建processor
  4. 等待连接请求,并将之交给processor处理
    TSimpleServer
    单线程,一般用于测试
    TThreadedServer
    多线程(不是线程池)
    TThreadPoolServer
    线程池
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值