美文网首页Java 杂谈Java技术升华
Thrift(二):各种 Server 实现

Thrift(二):各种 Server 实现

作者: 聪明的奇瑞 | 来源:发表于2018-07-09 15:56 被阅读17次

Thrift 为服务器端提供了多种工作模式:TSimpleServer、TNonblockingServer、THsHaServer、TThreadPoolServer、TThreadedSelectorServer

TSimpleServer

  • TSimpleServer 是一个单线程阻塞 I/O 的 Server,它循环监听新请求的到来并对请求进行处理
  • 但一次只能接收和处理一个 Socket 连接,效率低,主要用于测试和学习,实际开发很少用到
TSimpleServer

TNonblockingServer

  • TNonblockingServer 是一个单线程 NIO 的 Server,NIO 通过 Selector 循环监听所有 Socket,每次 selector 结束时,处理所有就绪状态的 Socket
  • 一个阻塞 I/O 线程一次只能处理一个 Socket 连接,而一个 NIO 线程可以处理多个 Socket 连接
  • 虽然一个 NIO 线程可以同时接收多个 Socket 连接,但在处理任务时仍然是阻塞的
TNonblockingServer
public class Server {
    public static void main(String[] args) throws Exception {
        TProcessor processor = new UserService.Processor<UserService.Iface>(new UserServiceImpl());
        TNonblockingServerSocket serverSocket = new TNonblockingServerSocket(8181);
        TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();
        TNonblockingServer.Args serverArgs = new TNonblockingServer.Args(serverSocket)
                .processor(processor)
                .protocolFactory(protocolFactory);
        TServer server = new TNonblockingServer(serverArgs);
        System.out.println("开启Thrift服务器,监听端口:8181");
        server.serve();
    }
}

TThreadPoolServer

  • TThreadPoolServer 模式采用阻塞 Socket 方式工作,主线程负责阻塞监听是否有新的 Socket 连接,业务交由一个线程池进行处理
  • 该模式的处理能力受限于线程池的工作能力,当并发请求数大于线程池中的线程数时,新的请求会进入队列中排队等待处理
TThreadPoolServer
public class Server {
    public static void main(String[] args) throws Exception {
        TProcessor processor = new UserService.Processor<UserService.Iface>(new UserServiceImpl());
        TServerSocket serverSocket = new TServerSocket(8181);
        TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();
        TThreadPoolServer.Args serverArgs = new TThreadPoolServer.Args(serverSocket)
                .processor(processor)
                .protocolFactory(protocolFactory);
        TServer server = new TThreadPoolServer(serverArgs);
        System.out.println("开启Thrift服务器,监听端口:8181");
        server.serve();
    }
}

THsHaServer

  • THsHaServer 是 TNonBlockingServer 的子类,在 TNonBlockingServer 模式中,采用一个线程来完成对所有的 Socket 监听和业务处理,造成了效率低下,而 THsHaServer 模式使用了一个线程池来专门进行业务处理
THsHaServer
public class Server {
    public static void main(String[] args) throws Exception {
        TProcessor processor = new UserService.Processor<UserService.Iface>(new UserServiceImpl());
        TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(8181);
        TTransportFactory transportFactory = new TFramedTransport.Factory();
        TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();
        THsHaServer.Args serverArgs = new THsHaServer.Args(serverTransport)
                .processor(processor)
                .protocolFactory(protocolFactory)
                .transportFactory(transportFactory);
        TServer server = new THsHaServer(serverArgs);
        System.out.println("开启Thrift服务器,监听端口:8181");
        server.serve();
    }
}

TThreadedSelectorServer

  • TThreadedSelectorServer 是 Thrift 目前最高级的模式,它内部由几个部分构成:
    • 一个 AcceptThread 线程对象,专门用于处理 Socket 上的新连接
    • 若干个 SelectorThread 对象专门用于处理业务 Socket 的网络 I/O 操作,所有网络数据的读写都是由这些线程来完成的
    • 一个负载均衡器 SelectorThreadLoadBalancer 对象,主要用于 AcceptThread 线程接收到新的 Socket 连接请求时,将请求分配给 SelectorThread 线程
    • 一个 ExecutorService 线程池,负责完成业务逻辑处理
TThreadedSelectorServer
public class Server {
    public static void main(String[] args) throws Exception {
        TProcessor processor = new UserService.Processor<UserService.Iface>(new UserServiceImpl());
        TNonblockingServerSocket serverSocket = new TNonblockingServerSocket(8181);
        TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();
        TThreadedSelectorServer.Args serverArgs = new TThreadedSelectorServer.Args(serverSocket)
                .processor(processor)
                .protocolFactory(protocolFactory);
        TServer server = new TThreadedSelectorServer(serverArgs);
        System.out.println("开启Thrift服务器,监听端口:8181");
        server.serve();
    }
}

相关文章

网友评论

    本文标题:Thrift(二):各种 Server 实现

    本文链接:https://www.haomeiwen.com/subject/dtltpftx.html