前言
在本人转载的另一篇博客里,介绍了Thrift的5种服务模型原理,相信大家读了后都会觉得挺简单,很容易理解,但在实际中Thrift的服务实现还是很复杂的,所以该系列文章作者将带领大家一起探索Thrift服务模型的实现,需要读者自行了解Thrift相关概念以及依赖到的ServerSocket、Nio等技术。由于整个框架体系非常庞大,所以我们从最简单的服务器的创建开始,并简单介绍一下类体系,将有助于后面对源码的探索。http://ifeve.com/java-nio-all/ 这是Nio相关资料,没有接触Nio的同学可以参考。
服务的创建
由于Thrift的源码体系非常多,作者也只了解常用的一些类,所以我们的分析过程由服务创建过程展开,下面是5种类型的服务端的简单版创建代码,其中GenericServing由Thrift编译器生成,ServiceImpl 类是本地业务逻辑实现类,这里不详列:
TSimple型:
int port = 10111;
TServerTransport serverTransport = new TServerSocket(port);
TServer.Args args = new TServer.Args(serverTransport);
args.protocolFactory(new TBinaryProtocol.Factory());
args.processorFactory(new TProcessorFactory(new GenericServing.Processor(new SeviceImpl());));
TServer tServer=new TSimpleServer(args);
tServer.serve();
TThreadPoolServer型:
int port = 10111;
TServerTransport serverTransport = new TServerSocket(port);
TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverTransport);
args.protocolFactory(new TBinaryProtocol.Factory());
args.processorFactory(new TProcessorFactory(new GenericServing.Processor(new SeviceImpl());));
TServer tServer=new TThreadPoolServer(args);
tServer.serve();
TNonblockingServer型:
int port = 10111;
TNonblockingServerSocket socket = new TNonblockingServerSocket(port);
TNonblockingServer.Args args = new TNonblockingServer.Args(socket);
args.protocolFactory(new TBinaryProtocol.Factory());
args.processorFactory(new TProcessorFactory(new GenericServing.Processor(new SeviceImpl());));
TServer tServer = new TNonblockingServer(args);
tServer.serve();
THsHaServer型:
int port = 10111;
TNonblockingServerSocket socket = new TNonblockingServerSocket(port);
THsHaServer.Args args = new THsHaServer.Args(socket);
args.protocolFactory(new TBinaryProtocol.Factory());
args.processorFactory(new TProcessorFactory(new GenericServing.Processor(new SeviceImpl());));
TServer tServer = new THsHaServer(args);
tServer.serve();
TThreadedSelectorServer型:
int port = 10111;
TNonblockingServerSocket socket = new TNonblockingServerSocket(port);
TThreadedSelectorServer.Args args = new TThreadedSelectorServer.Args(socket);
args.protocolFactory(new TBinaryProtocol.Factory());
args.processorFactory(new TProcessorFactory(new GenericServing.Processor(new SeviceImpl());));
TServer tServer = new TThreadedSelectorServer(args);
tServer.serve();
看似不同类型的服务端创建过程都有所区别,但遵从的模式不外乎为以下步骤:
1.创建TTransport层监听端口,用于接收客户端的请求
2.根据TTransport接口创建服务器参数对象args
3.为args对象设置TProtocol协议工厂对象
4.根据业务实现对象ServiceImpl创建相应的TProcessor对象,并封装到TProcessorFactory中,最后为args对象设置TProcessor业务执行工厂对象
5.根据args来创建相应的服务器并启动服务
这一节我们了解了创建一个服务器的步骤,下一节我们按这些步骤来介绍各个层次间的功能及类关系,后续讲解源码时不再详述。
类体系
一、TTranport层
这一层根据功能不同划为下面两个接口:
TServerTransport接口:服务端用于监听端口并接收客户端请求,同时生成TTransport连接。
TTransport接口:用于客户端服务端间的通信。
这两个接口的关系可理解为Java中ServerSocket与Socket的关系, 类关系图如下:
这里只列举TTransport常用的实现类
关于TTransport的实现类:
1.阻塞型服务使用TServerSocket,TServerSocket内部会构造一个Java原生的ServerSocket对象,ServerSocket监听到客户端请求时创建一个Socket对象,并封装为TSocket对象,用于客户端服务端后续通信。
2.非阻塞型服务使用TNonblockingServerSocket,TNonblockingServerSocket内部构造了一个ServerSocketChannel对象,ServerSocketChannel监听到客户端请求时创建一个SocketChannel对象,并封装为TNonblockingSocket对象用于客户端服务端后续通信。
二、TProtocol层
该层需要了解以下两个接口:
1.TProtocol接口:依赖TTransport对象,定义了序列化、反序列化等一系列操作并通过TTransport进行输出,常见的实现有二进制协议、压缩协议。
2.TProtocolFactory接口:该接口只有一个方法,定义了如何通过一个TTransport参数对象来获取一个TProtocol对象,TProtocolFactory的实现都在对应的TProtocol实现中。
类关系如下图所示:
三、TProccessor层
这一层和TProcotol非常相似,分为下面两个接口(类):
1.TProcessor接口:依赖于TProtocol接口,是业务逻辑的处理接口,但仅仅是定义一个接口,TProcessor的实现类都在Thrift编译器生成的代码中。例如:上面创建服务时用到的GenericServing.java类,便是由编译器生成 ,里面有一个静态类Processor实现了TProcessor接口。这里我们只需要知道,由编译器生成的TProcessor实现类中会帮我们将TProcessor接口的调用转到我们的业务实现类SeviceImpl中即可。
2.TProcessorFactory类:用于获取TProcessor对象,源码中创建该Factory时需要传入一个TProcessor对象,仅仅是保存TProcessor对象。
四、Args与TServer类体系
从上一节的创建步骤中能够看到多种类型Args,第一眼看上去感觉特别乱,但其实每个Args类都是在相应的服务类中,作为参数集合对象提供给相应的服务,只有TSimpleServer较特殊,其参数Args对象在TServer中,TServer与Args类关系图如下:
总结
看完本章,大家应该对服务端每个层次的接口类体系,以及相应功能有一个大概了解,从下一章开始我们将依照上面的顺序进行源码探索。