Thrift 的基本结束
Thrift https://thrift.apache.org/ 是一个跨语言的服务部署框架, 最初由 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 代码分析, 可以借鉴和学习的方面:
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)
来源: http://www.bubuko.com/infodetail-2993346.html