Thrift源码系列----1.服务端类体系

前言

        在本人转载的另一篇博客里,介绍了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类关系图如下:


这里写图片描述
这里写图片描述


总结

        看完本章,大家应该对服务端每个层次的接口类体系,以及相应功能有一个大概了解,从下一章开始我们将依照上面的顺序进行源码探索。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值