[Thrift分析]

   Thrift定义一套IDL(Interface Definition Language)用于描述接口,通常后缀名为.thrift,通过thrift程序把.thrift文件导出成各种不一样的代码的协议定义。除此之外,Thrift自定了一套C/S交互的框架,帮助开发者免去人工解包/打包协议的工作。下面会按文件从里到外仔仔细细地分析Thrift整个框架体系。

  Thrift定义的数据没有构造函数,导致有些情况下不方便。无法定义list成员变量,有些情况下也很不方便。C++ coder的硬伤。

  

[Common]

   公共文件放置于根目录下,下面一一介绍。

  1、config.h:此文件是thrift的configure脚本检测出的你的操作系统环境头文件。此文件为configure脚本生成。是一堆宏命令,例如可能有个宏,如果有某个头文件则定义为1,否则为0,以此来提供代码中感知开发者操作系统环境的能力。

  2、Thrift.h、Thrift.cpp:此文件提供2个类,TOutput、TException。TOutput用于输出,默认输出到stderr,提供了print,(),perror()三个函数用于输出,有一个全局变量GlobalOutput,其它地方的输出都通过此变量控制。TException继承于std::exception,提供what方法。

  3、TProcessor.h:此文件为特定功能类,只因此类功能只有1个文件,所以放在在根目录下。此类提供process函数接口,一个虚函数是用于开发者继承,另一个提供一个入口。构造函数为protected,所以显示不能生成此类的的实例,只能生成此类子类的实例。Auto-Gen的processor会把调用dispatch到相应的service接口。

  4、TLogging.h:此文件提供各种log宏,大至分3类,debug、log、erro,但是与TOutput无关。

  5、TApplicationException.h/.cpp:此文件类为继承于TException。提供了type字段,type用于分类错误类型。此类提供了对protocol的write和read的支持,即提供了RPC能力。

   6、TReflectionLocal.h:暂未知,后续补充。

protocol

  1、TProtocol.h:定义到协议类TProtocol和TProtocolFactory基类,这2个类本身无作用,是个基类,提供操作协议的统一接口。

  2、TProtocolException.h:和TApplicationException类似,继承于TException。提供了TProtocolExceptionType字段,以分类protocol错误类型。

  3、TOneWayProtocol.h:内含TWriteOnlyProtocol、TReadOnlyProtocol,均继承于TProtocol。TWriteOnlyProtocl把所有的read方法都抛出异常,TReadOnlyProtocl同理。

  4、TProtocolTap.h:内含TProtocolTap类,此类实现监听功能,即若B对象需要监听A对象,则生成TProtocolTap对象,以A、B为参数,以后要读A的时候,通过TProtocolTap对象读取,TProtocolTap会把读取请求传递给A,拿到结果后把结果写入到B。即完成B对A的监听。

  5、TBase64Utils.h/.cpp:内含base64方法。

  6、TBinaryProtocol.h/.cpp:把数据类型的内存二进制直接写入到transport里面。

  7、TJSONProtocol.h/.cpp:把数据以JSON的形式写入到transport,例如一个字符串会加上""。

  8、TCompactProtocol.h/.cpp:把根据thrift-110,实现数据的紧缩协议。

  9、TDebugProtocol、TDenseProtocol:thrift0.5版本中这2个类正在实验中,推荐不用。

  So,开发者直接使用的高频protol内容为:TBinaryProtocol、TJSONProtocol、TProtocolTap、TBase64Utils。

transport

  1、TTransport.h:Transport基类,提供的接口大致可按如下分类:open/close、read/write、peek。transport的目的只有2个,一个是read指定长度数据,一个是write指定长度数据。

  2、TServerTransport.h:服务端transport基类,主要是为监听的socket提供功能(Client总不需要listen、accept吧)。接口分类:listen()、accept()、interrupt()。

  3、TShortReadTransport.h:测试用,对读取采用随机长度读取,开发者不应该使用。

  4、TSocket.h/.cpp:客户端的socket transport实现。通过指定host、port,通过TTransport中的方法即可实现数据的发送。

  5、TSocketPool.h/.cpp:继承于TSocket,此类提供管理多个server的能力,server的host&port聚合为TSocketPoolServer对象,存储在TSocketPool中。

  6、TTransportException.h/.cpp:与TProtocolException类似,提供transport的错误类型。

  7、TServerSocket.h/.cpp:实现了TServerTransport,accept后会返回一个TSocket。常用方法为listen()、accept()、interrupt()。

  8、TBufferTransports.h/.cpp:

    1)TBufferBase类提供对buffer的抽象操作,四个指针:rBase_、rBound_、wBase_、wBound_。

    2)TUnderlyingTransport提供buffer的生成,四个变量:rBuf_、rBufSize_、wBuf_、wBufSize_,以及集成了一个trans_。

    3)TBufferedTransport完成从transport读取数据到buf的操作,buffer长度固定。

    4)TBufferedTransportFactory工厂类。

    5)TFramedTransport,与TBufferedTransport相比,buf会变,不调用flush的数据就不会发到transport。

    6)TFramedTransportFactory工厂类。

    7)TMemoryBuffer类继承于TBufferBase,数据存储在内存,没有也不会通过trans_发送。

    黑体加粗部分为对开发者暴露类。

  9、TFDTransport.h/.cpp:直接从文件中read/write,FD就是file description的缩写。

  10、TSimpleFileTransport.h/.cpp:继承于TFDTransport,添加根据文件名打开FD的功能。

  11、……

processor

  1、StatsProcessor.h:用于输出RPC调用LOG,此类用于调试。

  2、PeekProcessor.h/.cpp:

concurrency

  1、Thread.h:提供Runnable,用于开发者实现一个可供Thread调用的任务。Thread绑定一个Runnable,通过start方法开启线程调用Runnable。ThreadFactory根据Runnable产生Thread。

  2、Monitor.h:提供条件变量功能。

  3、Exception.h:提供一些继承于TException的子类,用于标记异常。

  4、Mutex.h/.cpp:提供一般锁/读写锁,以及相应的Guard。

  5、ThreadManager.h/.cpp:工作线程(Worker)和任务管理器(Task)。类似于Cocoa中的GCD,可设置N个执行线程,M个Task。另外还有许多可配置项。

  6、PosixThreadFactory.h/.cpp:一个线程工厂。

  7、Util.h/.cpp:提供些有用的辅助方法。

  8、FunctionRunner.h:提供把函数包装成Runnable的功能。

  9、TimerManager.h/.cpp:类似于ThreadManager。Dispatcher为唯一的工作线程,当有task时,从task_list中取出到时间的task以执行。单线程。

server

   1、TServer.h:

    1)TEventHanlder是服务端实现功能的地方,实现preServe,clientBegin,clientEnd方法。preServe()在listen成功后只调用一次。每接受一个新Client,clientBegin和clientEnd就调用一次。

    2)TServer是一个虚基类,绑定一个TProcessor,用于处理数据,个TServerTransport用于处理数据发送与连接,一个eventHanlder用于将数据dispatch到服务端自己的逻辑代码中。提供serve()=0方法,是开启服务的入口。此类只是一个基类。实现了Runnable接口,可以被线程TThread唤起。

  2、TSimpleServer.h:是TServer的一个子类,实现单线程阻塞的服务器。循环调用process处理数据。

   3、TThreadedServer.h:继承于TServer(提供serve入口)。每新到一个請求,则新建一个Task对象(Runnable),TThreadFactory根据Task对象生成一个线程,然后运行。所以此类与TSimpleServer的单线程阻塞式不一样,此类对每一个請求开启一个新线程处理。

   4、TThreadedPoolServer.h/.cpp:内部使用ThreadManager来管理线程和任务,TThreadedPoolServer只是实现了TServer的相关内容,核心都在ThreadManager中。

   5、TNonblockingServer.h/.cpp:使用了libevent的异步模型。非阻塞服务器。libevent性能有待研究。内部也可以使用ThreadManager,如果使用ThreadManager则上TThreadedMangePoolServer一样了。

Thrift分析的更多相关文章

  1. RPC框架之Thrift分析(转)

    一.简介 1.Thrift是Facebook开发的跨语言的RPC服务框架.随后贡献给Apache开源组织.成为RPC服务的主流框架.   2.特点:  优点:       跨语言,支持java.c/c ...

  2. apache thrift分析

    thrift是一个用来实现跨语言的远程调用(RPC Remote Procedure Call)的软件框架.根据接口定义语言(IDL Interface definition lanuage) 并借助 ...

  3. Thrift的TJsonProtocol协议分析

    Thrift协议实现目前有二进制协议(TBinaryProtocol),紧凑型二进制协议(TCompactProtocol)和Json协议(TJsonProtocol). 前面的两篇文字从编码和协议原 ...

  4. Thrift的TBinaryProtocol二进制协议分析

    先上张图,说明一下thrift的二进制协议是什么东东. 报文格式编码: bool类型: 一个字节的类型,两个字节的字段编号,一个字节的值(true:1,false:0). Byte类型: 一个字节的类 ...

  5. Thrift的TCompactProtocol紧凑型二进制协议分析

    Thrift的紧凑型传输协议分析: 用一张图说明一下Thrift的TCompactProtocol中各个数据类型是怎么表示的. 报文格式编码: bool类型: 一个字节. 如果bool型的字段是结构体 ...

  6. golang thrift 源码分析,服务器和客户端究竟是如何工作的

    首先编写thrift文件(rpcserver.thrift),运行thrift --gen go rpcserver.thrift,生成代码 namespace go rpc service RpcS ...

  7. 通过Thrift访问HDFS分布式文件系统的性能瓶颈分析

    通过Thrift访问HDFS分布式文件系统的性能瓶颈分析 引言 Hadoop提供的HDFS布式文件存储系统,提供了基于thrift的客户端访问支持,但是因为Thrift自身的访问特点,在高并发的访问情 ...

  8. 记一次内存溢出的分析经历——thrift带给我的痛orz

    说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是 ...

  9. Thrift 代码分析

    Thrift的基本结束 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过IDL(Interface Definiti ...

随机推荐

  1. WIN8.1 PRO RTM VOL.2013.09.18

    文件名:cn_windows_8_1_pro_vl_x64_dvd_2791218.isoSHA1:61C002551763E22B64EB1BACEFFE83620114C3D6 文件名:cn_wi ...

  2. SSRS实现 矩阵列实现动态列

    需求背景:按区域查询店铺的销售量和库存量,然后店铺的数据是动态的.实现类似效果如下图,其中蓝色框是动态的,店铺的数量是不确定的,可能是3个,也可能是20个. 步骤一: 步骤二: 加工后: 最后效果:

  3. Android Studio利用GitHub托管项目

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  4. 一起来点React Native——你必须要会点FlexBox布局

    一.FlexBox布局 1.1 FlexBox是什么意思呢? flexible(形容词):能够伸缩或者很容易变化,以适应外界条件的变化 box(名词):通用的矩形容器 1.2  什么是FlexBox布 ...

  5. iPhone设备及屏幕适配

    // // Common.h // 微信 // // #ifndef Common_h #define Common_h // iPhone设备及屏幕适配 //4的设备 #define KDevice ...

  6. ballerina 学习二十一 http2

    ballerina 支持http2 协议,包含server push http2 协议 参考代码 import ballerina/http; import ballerina/log;endpoin ...

  7. Eclipse添加中文javadoc

    SUN官方API中文版[JDK1.6]1.6API文档(中文)的下载地址:ZIP格式用来设置javadoc,下载地址:http://download.java.net/jdk/jdk-api-loca ...

  8. jenkins需要安装的插件

    jenkins plugin 需要安装的插件: •发布插件 Deploy to container Plugin 必须 •Maven插件 Maven Integration plugin必须 •git ...

  9. 纯php实现中秋博饼游戏(1):绘制骰子图案

    最近公司中秋博饼(在厦门),自己没事也想玩玩,所以就想动手写了一个纯php实现的中秋博饼游戏,既然要纯php实现,就要用php来生成图案,所以第一步就先绘制骰子图案. 平时很少使用php绘图,不过查查 ...

  10. moodle搭建相关的笔记

    关于moodle内网外网访问问题的解决方案(转) http://blog.chinaunix.net/uid-656828-id-3106027.html