Thrift的基本结束

Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过IDL(Interface Definition Language,接口定义语言)来定义RPC(Remote Procedure Call,远程过程调用)的接口和数据类型,然后通过thrift编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现。

Thrift代码分析

Thrift代码分析,可以借鉴和学习的方面:

1、代码分层设计,Thrift分传输层、协议层、处理层、服务层四个层设计,上层只依赖下层,方便扩展和维护。

2、基于接口编程和多用抽象工厂设计,每层之间都有一个核心的接口,各个实体初始化基本是使用工厂设计模式,降低耦合。

3、基于BIO和NIO,满足不同情景,便于性能调优。

层次如下图:

各层的调用顺序如下图:

各层的类设计如下

传输层

TTransport:客户端传输层抽象基础类,主要方法:read、write、flush、open、close。read、write方法为核心

TSocket 与 TNonBlockingSocket:分别是基于BIO和NIO客户端传输类。 TSocket持有Socket,设置输入输出流使用1K的BufferedStream,

TNonBlockingSocket持有SocketChannel,read和write方法里的byte会每次被wrap成一个ByteBuffer。

TServerSocket 与 TNonBlockingServerSocket:分别是基于BIO和NIO服务端传输类。TServerSocket持有ServerSocket,TNonBlockingServerSocket持有ServerSocketChannel。

TFramedTransport与TFastFramedTransport:将数据封装Frame(帧)实现的, TFastFramedTransport效率内存使用率高,使用了自动扩展长度的buffer

TZlibTransport:读取时按1K为单位将数据读出并调用JDK的zip函数进行解压再放到Buffer,写入时,在flush时先zip再写入。

TSaslClientTransport与TSaslServerTransport:提供SSL校验

协议层

1)IDL 定义支持类型:

基本类型: i16,i32,i64, double, boolean,byte,byte[], String。

容器类型: List,Set,Map,TList/TSet/TMap类包含其元素的类型与元素的总个数。

Struct类型:即面向对象的Class,继承于TBase。TStruct类有Name属性,还含有一系列的Field。TField类有自己的Name,类型,顺序id属性。

Exception类型:Struct,继承于TException这个checked exception。

Enum类型:传输时是个i32。

Message类型:封装往返的RPC消息。TMessage类包含Name,类型(请求,返回,异常,ONEWAY)与seqId属性。

2) 类分析:

TProtocol:基础抽象类,拥有对IDL定义支持类型read和write方法,对于结构类型先readxxBegin()(或writexxBegin()),结束时调用readxxEnd() (或readxxEnd())方法。

TBinaryProtocol:二进制流传输协议类,把各类型转换成byte数组,交给TTransport传输。

TCompactProtocol:压缩方法二进制协议类,将Integer按照ZigZag

TTupleProtocol:继承TCompactProtocol,Struct使用时更省空间

TJSONProtocol:Json格式协议类,将数据封装成Json格式,再转为byte数组交给传输层。

TSimpleJSONProtocol:Json格式协议类,但只支持写的功能。

TProtocolFactory:TProtocol的工厂基础类,每个TProtocol实现类均有一个工厂实现。

Server层

TServer :基础抽象类,实际上类似一个容器,持有TProcessor、TTransport、TProtocol的工厂对象,AbstractServerArgs作为参数抽象类,提供一个serve()方法,用于启动服务,stop()方法停止服务。

TSimpleServer :单线程阻塞式服务,只用于做测试的简单服务类。

TNonblockingServer:支持非阻塞单线程服务模型,基于NIO的Select实现。

THsHaServer:继承TNonblockingServer。单线程处理I/O,线程池请求的处理。

TThreadedSelectorServer: 继承AbstractNonblockingServer。维持两个线程池,一个线程池处理I/O,另一个线程池处理请求。  以下代码时默认的线程池设置:

 Public class TThreadedSelectorServer extends AbstractNonblockingServer{

Public static class Args extends AbstractNonblockingServerArgs<TThreadedSelectorServer.Args>{
Public int selectorThreads = 2;
Private int workerThreads = 5;
Private int stopTimeoutVal = 60;

TThreadPoolServer:专门的线程接受请求并交给线程池处理,完成后线程池连接释放。请求处理线程和I/O线程为同一线程。阻塞式线程池模型。

Processer层

TProcessor:基础接口,抽象方法process(TProtocol in, TProtocol out)

TBaseProcessor :基础抽象类,持有processMap对象,key为方法名标示,value为方法(ProcessFunction的实例),实现TProcessor的方法process,in.readMessageBegin()拿到传过来的方法名,如果存在则准备交给具体业务类执行,否则抛出无效方法的异常。

Processor:IDL生成,实现TProcessor接口并继承TBaseProcessor类。

TAsyncProcessor:异步处理接口,抽象方法process(final AsyncFrameBuffer fb)TBaseAsyncProcessor:异步处理抽象类,持有processMap对象,key为方法名标示,value为方法(AsyncProcessFunction的实例),实现TAsyncProcessor的方法process(final AsyncFrameBuffer fb),AsyncProcessFunction的getResultHandler方法拿到一个AsyncMethodCallback,带执行start方法后通过sendResponse方法返回。 AsyncProcessor 由IDL生成,实现TAsyncProcessor接口并继承TAsyncProcessor类。

TProcessorFactory: 构建 TProcessor的工厂类

(The End)

Thrift 代码分析的更多相关文章

  1. Hive metastore整体代码分析及详解

    从上一篇对Hive metastore表结构的简要分析中,我再根据数据设计的实体对象,再进行整个代码结构的总结.那么我们先打开metadata的目录,其目录结构: 可以看到,整个hivemeta的目录 ...

  2. 一个简单的"RPC框架"代码分析

    0,服务接口定义---Echo.java /* * 定义了服务器提供的服务类型 */ public interface Echo { public String echo(String string) ...

  3. Thrift源代码分析(八)--总结加一个完整的可执行的Thrift样例

    前面七篇文章分析了Thrfit的方方面面,看到这里时应该对Thrift有了深入的理解. Thrift源代码分析(一)-- 基本概念 Thrift源代码分析(二)-- 协议和编解码 Thrift源代码分 ...

  4. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  5. pmd静态代码分析

    在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...

  6. [Asp.net 5] DependencyInjection项目代码分析-目录

    微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...

  7. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)

    Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...

  8. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  9. STM32启动代码分析 IAR 比较好

    stm32启动代码分析 (2012-06-12 09:43:31) 转载▼     最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...

随机推荐

  1. 1到n的最小步数

    1到n的最小步数 Time Limit: 1 Sec  Memory Limit: 128 MB 给你一个数n,让你求从1到n的最小步数是多少. 对于当前的数x有三种操作: 1:  x+1 2:  x ...

  2. 开发中常用的JS知识点集锦

    索引 1.对象深拷贝 2.网络图片转base64, 在线图片点击下载 3.常用CSS样式记录(超出宽高省略展示/播放icon/按钮背景颜色渐变...) 4.对象深拷贝 5.对象深拷贝 6.对象深拷贝 ...

  3. ASP.NET MVC 执行流程介绍

    Routing 组件   Controller   Controller中可用的ActionResult MVC-View(使用的抽象工厂模式的视图引擎) 视图模型

  4. 大数据学习之HDFS基本命令操作05

    1)hdfs的客户端 1.网页形式->测试用 http://192.168.40.11:50070/dfshealth.html#tab-overview 2.命令行形式->测试用 3.企 ...

  5. UOJ#440. 【NOIP2018】填数游戏 动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ440.html 前言 菜鸡选手到省选了才做联赛题. 题解 首先我们分析一下性质: 1. 假如一个格子是 0,那么它的右上角 ...

  6. MySQL 如何使用左链接代替 NOT IN

    核心思想 通过左链接 查询出要排除的数据 然后和主表进行匹配 拿去未匹配到的数据 可以使用 IS NULL 来过滤掉 案例稍后 更新 select * from a left join on a.id ...

  7. Metasploit远程调用Nessus出错

    Metasploit远程调用Nessus出错   从Nessus 7.1开始,Metaspliot远程调用Nessus创建新的扫描任务,会出现以下错误信息:   [*] New scan added ...

  8. S2.1 修复图像小程序(简单版)

    用OpenCV自带的inpaint()演示 CV_EXPORTS_W void inpaint( InputArray src, InputArray inpaintMask, OutputArray ...

  9. go 监听系统信号

    linux 信号查看 kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFP ...

  10. python中的矩阵、多维数组

    2. 创建一般的多维数组 import numpy as np a = np.array([1,2,3], dtype=int)  # 创建1*3维数组   array([1,2,3]) type(a ...