当前位置: 移动技术网 > IT编程>软件设计>架构 > Thrift 代码分析

Thrift 代码分析

2019年03月20日  | 移动技术网IT编程  | 我要评论

 

thrift的基本结束

thrift是一个跨语言的服务部署框架,最初由facebook于2007年开发,2008年进入apache开源项目。thrift通过idl(interface definition language,接口定义语言)来定义(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)

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网