thrift代码分析(代码片段)

tyol tyol     2023-03-09     672

关键词:

 

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,另一个线程池处理请求。  以下代码时默认的线程池设置:

  1 Public class TThreadedSelectorServer extends AbstractNonblockingServer
  2  3 Public static class Args extends AbstractNonblockingServerArgs<TThreadedSelectorServer.Args>
  4 Public int selectorThreads = 2;
  5 Private int workerThreads = 5;
  6 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源代码分析--tserverserver分析

Thrift採用了TServer来作为server的抽象,提供了多种类型的server实现。用TServerTransport作为server的Acceptor抽象,来监听端口。创建clientSocket连接先来看看TServerTransport。主要有两类1.TNonblockingServerTransport和TNonblockingServerSocket作为非堵塞IO... 查看详情

thrift一thrift安装部署(代码片段)

Thrift安装部署Thrift安装部署下载源码包安装g++解压Thrift安装包安装boost开发工具测试(python版)下载源码包wgethttp://apache.fayea.com/thrift/0.9.3/thrift-0.9.3.tar.gz安装g++centos:yuminstallgccgcc-c++如果没有安装g++,无法编译解压Thrift安装包tar-xvfthri... 查看详情

thrift安装(代码片段)

安装thrift-0.9.2步骤如下:1.下载#wgethttp://archive.apache.org/dist/thrift/0.9.2/thrift-0.9.2.tar.gz2.安装依赖#yum-yinstallautomakelibtoolflexbisonpkgconfiggcc-c++boost-devellibevent-develzlib-develpython-develrub 查看详情

thrift开发笔记(代码片段)

thrift开发笔记(4种由易到难的匹配系统)准备工作创建项目文件夹thrift_project业务逻辑图游戏节点,创建game文件夹;匹配系统节点,创建match_system文件夹;thrift相关文件,创建thrift文件夹thrift简单语法介绍使用Thrift开... 查看详情

thrift开发笔记(代码片段)

thrift开发笔记(4种由易到难的匹配系统)准备工作创建项目文件夹thrift_project业务逻辑图游戏节点,创建game文件夹;匹配系统节点,创建match_system文件夹;thrift相关文件,创建thrift文件夹thrift简单语法介绍使用Thrift开... 查看详情

thrift介绍(代码片段)

Thrift是Apache下的可扩展,跨语言软件框架,可以无缝连接C++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,JavaScript,Node.js,Smalltalk,OCamlDelphi等其他语言目前最新版本:0.11.0(releasedon2017-DEC-07).Maven依赖:<dependency><g 查看详情

thrift框架应用参考(代码片段)

Thrifthttps://blog.csdn.net/aquester/article/details/48261609https://www.cnblogs.com/liboBlog/p/6077613.htmlhttps://www.cnblogs.com/yjmyzz/p/thrift-client-pool-demo.htmlhttps://www.cnblogs.com/DKSL/p/ 查看详情

半小时入门thrift(代码片段)

...。拆分后一定会存在进程之间的交互(简称:PRC),那么thrift就是facebook推出一款开源的rpc框架,且还跨语言。此文章就是来打开thrift的打开(当然这次还是基于.net)。示例代码下载:https://gitee.com/samtest-pr 查看详情

thrift简单示例(go语言)(代码片段)

这个thrift的简单示例来自于官网(http://thrift.apache.org/tutorial/go),因为官方提供的例子简单易懂,所以没有必要额外考虑新的例子.关于安装的教程,可以参考https://www.cnblogs.com/albizzia/p/10838646.html,关于thrift文件的语法,可以参考:https://www.... 查看详情

qt中调用thrift(代码片段)

thrift是一个Apache公司开源的一款RPC(RemoteProcedureCall)框架,让不同语言构建的服务可以做到远程调用无缝对接。thrift库分两部分:libthrift-核心库文件,需要依赖OpenSSL、boostlibthriftnb-包含thrift非阻塞服务器࿰... 查看详情

thrift简单示例(基于c++)(代码片段)

这个thrift的简单示例,来源于官网(http://thrift.apache.org/tutorial/cpp),因为我觉得官网的例子已经很简单了,所以没有写新的示例,关于安装的教程,可以参考https://www.cnblogs.com/albizzia/p/10838646.html,关于thrift文件的语法,可以参考:https://www.cnbl... 查看详情

thrift程序(例子2)(代码片段)

thrift链接:https://www.cnblogs.com/sxrtb/p/12209455.html 一thrift文件  文件名为tutorial.thrift/**LicensedtotheApacheSoftwareFoundation(ASF)underone*ormorecontributorlicenseagreements.SeetheNOTICEfile*distributedwiththisworkforadditionalinformation*regardingcopyrightownership.TheA... 查看详情

rpc服务框架thrift介绍(代码片段)

 rpc服务框架目前主要有thrift,grpc,dubbo,HSF等这里主要介绍thrift框架git地址 :https://github.com/apache/thrift/tree/0.9.11.接口定义 tutorial.thriftinclude"shared.thrift"/***Thriftfilescannamespace,package,orprefixtheiroutputinvarious*targetlanguages.*/namespaceclt... 查看详情

centos7部署thrift(代码片段)

安装部署thrift下载thriftwgethttp://mirrors.hust.edu.cn/apache/thrift/0.11.0/thrift-0.11.0.tar.gz解压thrifttar-zxvfthrift-0.11.0.tar.gz将解压后的文件,移动到合适的目录下在官方下载的tar包中已经有了configure脚本,如果是首次下载的源码文件没有configur... 查看详情

thriftrpc系列教程——thrift语言(代码片段)

Thrift不是严格意义上的编程语言,但是却胜过很多编程语言,充满了美感。基础数据类型Thrift这门编程语言提供了如下几种基础的数据类型:bool:Abooleanvalue(trueorfalse)byte:An8-bitsignedintegeri16:A16-bitsignedintegeri32:A32-bitsignedintegeri64:A64-bi... 查看详情

dapeng-soa启动分析(代码片段)

....Scala-sbt插件sbt是Scala项目管理工具,类似于Java中的Maven.1.1.ThriftGeneratorPlugin生成Thrift代码及资源1.2.RunContainerPlugin运行大鹏服务1.3.DbGeneratePlugin数据库生成插件1.4.ImageGeneratorPlugin镜像生成器2.大鹏容器分析2.1.启动流程2.1.1.大鹏 查看详情

thrift的一些概念(代码片段)

    Thrift最初是由Facebook开发的,因为随着流量和网络结构的扩展,一些操作如搜索、分发、事件日志记录等已经超出系统的处理范围,所以Facebook的工程师开发服务时选择了多种不同的编程语言来达到满意的性能... 查看详情

thrift使用(代码片段)

一、什么是thrift  Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由FaceBook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎... 查看详情