Thrift的TProtocol类体系原理及源码详解:类继承架构分析

这部分相关的类主要实现与协议相关的内容,这里说的协议是指对数据传输格式封装的协 议,实现不同的协议来适合不同场景下的数据传输,因为在不同的场景下不同协议对于数据 传输来说效率有很大的差别。下面是这个部分相关类的类关系图:

由以上类图可以发现所有的协议类都从TProtocol类直接或间接继承,每一个协议 类都有一个对应的生产对象工厂(协议工厂)。TProtocol是一个抽象的类,不能直接使用的 ,它有一个直接子类默认实现了所有方法(空实现),如果我们需要定义自己的数据传输协 议可以直接从这个类继承。

第一节 类继承架构分析

为什么需要对这部分的 类继承架构进行分析了?上面不是有很清楚的类继承关系图了吗?但是Facebook在实现时并 不是简单的这样继承下来就可以了,Facebook为了后期协议的可扩展性和允许其他组织、团 队或个人实现自己的数据传输(主要是数据格式的封装)协议,里面多加了一层继承关系, 就是类图中的TVirtualProtocol类,从类的名称可以看出这是一个虚的协议。怎样理解这个 虚的协议了?通过阅读代码我觉得可以这样理解:因为它定义为一个模板类,这个模板类有 两个参数,一个用于数据传输的真正协议,一个是用来继承的,它本身没有对协议具体内容 做实现,所以说它是一个虚的协议类。下面我们对这个类继承架构结合代码实现来具体分析 。

1 抽象类TProtocol和默认实现类TProtocolDefaults

抽象类对于每一种数 据类型都提供了读写的开始和介绍的方法,这里读写方法应该是针对网络IO读写,不过真正 实现网络读写还不是这里的方法,这里方法主要处理数据,例如对数据格式做调整。真正实 现网络IO读写是下一章介绍的TTransport相关类实现的,那里还会对传输的方式做相应控制 ,例如是否压缩。

除了具体的数据类型有写入和读取的方法,消息也是需要通过网络 传递,所以也定义了消息的传输读写方法。当然还定义了一些公用的功能,如跳过某一个结 构不读、大小端数据格式调整、主机字节序和网络字节序的相互转换等。

(1)首先 定义纯虚函数:

virtual uint32_t writeMessageBegin_virt(const 

std::string& name,

                                  const TMessageType messageType,  const int32_t 

seqid) = 0;

  virtual uint32_t writeMessageEnd_virt() = 0;

  virtual uint32_t writeStructBegin_virt(const char* name) = 0;

  virtual uint32_t writeStructEnd_virt() = 0;

(2)然后定义调用相应纯虚函 数的函数:

uint32_t writeMessageBegin(const std::string& name, const TMessageType 

messageType, const int32_t seqid) {

   T_VIRTUAL_CALL();//打印调用日志函数

   return writeMessageBegin_virt(name, messageType, seqid);

 }

 uint32_t writeMessageEnd() {

   T_VIRTUAL_CALL();

   return writeMessageEnd_virt();

 }

 uint32_t writeStructBegin(const char* name) {//写结构体开始

   T_VIRTUAL_CALL();

   return writeStructBegin_virt(name);

 }

 uint32_t writeStructEnd() {//写结构体结束

   T_VIRTUAL_CALL();

   return writeStructEnd_virt();

 }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索协议
, 架构
, 数据传输
, const相关
, 方法
, const
, 一个
, 一个数据采集类
, 传输源码
, 虚函数实现原理
继承原理
,以便于您获取更多的相关知识。

时间: 2024-10-03 15:48:20

Thrift的TProtocol类体系原理及源码详解:类继承架构分析的相关文章

Thrift的TProtocol类体系原理及源码详解:紧凑协议类TCompactProtocolT(TCom

Thrift的TProtocol类体系原理及源码详解:紧凑协议类TCompactProtocolT(TCompactProtocol) 这个协议类采用了zigzag 编码,这种编码是基于Variable-length quantity编码提出来 的,因为Variable-length quantity编码对于负数的编码都需要很长的字节数,而zigzag 编 码对于绝对值小的数字,无论正负都可以采用较少的字节来表示,充分利用了 Varint技术. 所以这个协议类采用zigzag 编码可以节省传输空

Thrift的TProtocol类体系原理及源码详解:二进制协议类TBinaryProtocolT(TBi

Thrift的TProtocol类体系原理及源码详解:二进制协议类TBinaryProtocolT(TBinaryProtocol) 这个协议是Thrift支持的默认二进制协议,它以二进制的格式写所有的数据,基本上直接 发送原始数据.因为它直接从TVirtualProtocol类继承,而且是一个模板类.它的模板参数 就是一个封装具体传输发送的类,这个类才是真正实现数据传输的.这个类的定义上一节举 例已经出现过了就不在列出来了. 下面我就结合scribe的Log函数执行的具体过程来 分析使用这个协

Thrift的TProtocol类体系原理及源码详解:其他协议类和总结

第六节 其他协议类 主要的协议类基本上已经介绍完毕了,当然如果你有更好的实 现和思路也可以实现自己的协议类,只要按照我前面介绍的类层次结构继承就可以了.除了 前面几节介绍的协议类,Thrift还实现了一些自己内部使用的协议类,例如TDebugProtocol 类,采用开发人员可读的文本协议,有助于调试,又例如TProtocolTap类,它可以使用两种 协议类进行两次协议转换.放一个窃听装置在协议对象,任何读取这个类都是通过一个封闭 的协议对象的,但也反映为写第二个协议对象,还有一个就是用于异常的

Thrift的TProtocol类体系原理及源码详解:稠密协议类TDenseProtocol

这个协议类不建议投入到实际的生产环境(除非自己做了很强的压力和全面的测试).这 个密集协议的最大作用就是尽可能使用小的空间,密集协议类有两种类型的实例对象,一种 是独立的,它不被使用在rpc通信中,而只是用于编码和解码:另一种是非独立的实例类型, 它可以用于rpc通信,不过现在还不支持这种类型的实例. 要使用这个密集协议类来 进行编码和解码必须支持Thrift自己实现的一直特殊的记录数据类型形式:就是type_spec属 性,它的主要作用就是用于本地化反射机制来进行读写数据. 最佳的实践方法如下

Thrift的TProtocol类体系原理及源码详解:JSon协议类TJSONProtocol

JSON (JavaScript Object Notation)是一种数据交换格式,是以JavaScript为基础的数 据表示语言,是在以下两种数据结构的基础上来定义基本的数据描述格式的:1) 含有名称/ 值对的集合:2) 一个有序的列表.对于 JSON,其部分数据结构的BNF 定义如下所示.形如{ "name":"ldxian","age":23}就表示一个JSON 对象,其有两个属性,值分别为ldxian 和23.其余的如数字.注释等跟其他

thrift的TServer类体系原理及源码详解:服务器基类TServer

这一部分主要实现了底层IO通信,还涉及到通信服务器的堵塞.非堵塞.单线程.多线程 等运行模式,所以实现比较复杂.这一部分涉及到的类的关系图如下: 由上面的 类关系图可以看出,这一部分的类关系比较复杂,复杂的不是继承关系,而是相互之间的依 赖关系.因为服务器需要处理很多的任务,也需要处理多个客户端的连接,这就涉及到多线 程编程以及多线程之间通信及并发的情况.这一部分涉及到的并发编程的类容将在后面章节 单独分析,本章主要介绍服务器模型和IO通信的具体细节. 第一节 服务器基类 TServer 所有具

Thrift的TProcess类体系原理及源码详解

之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细分 析了!会利用到自动代码生成的知识. 这部分是协议层和用户提供的服务实现之间的 纽带,定义了调用服务实现的接口框架,真正实现某种服务接口是通过上一章介绍的代码生 成工具生成的代码.本章将介绍这个框架的基本原理,然后通过生成的一个实例来具体介绍 怎样完成一次完整的服务,这个可能涉及到下面章节的一些知识,对于这些知识不详细分析 其功能,只是介绍它在其中起什么作用.选择的实例是Facebook内部用这个框架实现的一个

thrift的TTransport类体系原理及源码详细解析1-类结构和抽象基类

本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩.分帧等,而这些 功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图, 如下: 由上面的类关系图可以看出,这部分的功能是相当的强大,所以类比较多且关系错综复杂.但是如 果理解清楚了这些类直接的关系就很容易掌握这部分的实现技术和这部分实现的功能.我们把这个类关 系图分为三部分来看,第一部分看抽象基类TTransport类,它是所有传输类的基类,有很大一部分类直 接从它继承实现它提供或者

Android Matrix源码详解_Android

Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.Android中的Matrix是一个3 x 3的矩阵,其内容如下:  Matrix的对图像的处理可分为四类基本变换: Translate           平移变换 Rotate                旋转变换 Scale                  缩放变换 Skew                  错切变换 从字面上理解,矩阵中的MSCALE用于处理缩放变换,MS