天天看點

Thrift初學--服務端構造(阻塞、非阻塞方式兩種服務端)

場景:

  • thrift-0.9.3版本

1、阻塞模式TThreadPoolServer      從源碼中很容易發現,該代碼采用的是JDK中java.net.ServerSocket作為服務端套接字。 是以,很容易輔助了解其為什麼為阻塞模式。

  •   服務端的示例代碼如下:   
            TServerSocketserverTran= newTServerSocket(18000);//負責服務端套接字的管理             Hello.Processor<Iface>pro= newProcessor<Iface>(newHelloImpl());             Factoryfactory= newTBinaryProtocol.Factory(true,true);             Argsargs= newArgs(serverTran);             args.processor(pro);             args.protocolFactory(factory);                          TServerserver= newTThreadPoolServer(args);             server.serve();// 啟動Server
  • TServer 源碼中啟動代碼如下:

server.serve();// 其源碼如下:

 publicvoid serve() {    try{      serverTransport_.listen();//這裡調用的是TServerSocket的listen()方法,監聽是否存在新的client申請     }catch(TTransportException ttx) {      LOGGER.error("Error occurred during listening.",ttx);      return;     }     ...   }

  • TServerSocket的初始化類如下:
 publicTServerSocket(ServerSocketTransportArgsargs)throws TTransportException {    clientTimeout_= args.clientTimeout;    if(args.serverSocket!=null) {      this.serverSocket_= args .serverSocket;      return;     }    try{      // Make server socket      serverSocket_= newServerSocket();//這裡引用的是java.net.ServerSocket類,阻塞模式的Socket      // Prevent 2MSL delay problem on server restarts      serverSocket_.setReuseAddress(true);      // Bind to listening port      serverSocket_.bind(args.bindAddr,args.backlog);     }catch(IOException ioe) {       close();      thrownew TTransportException("Could not create ServerSocket on address "+args.bindAddr.toString() +".",ioe);     }   }

2、非阻塞模式TNonblockingServer   源碼寫的非常清晰可見。

  • 服務端示例代碼如下
            TNonblockingServerTransportserverTran= newTNonblockingServerSocket(19000);//負責構造服務端套接字             Hello.Processor<Iface>pro= newProcessor<Iface>(newHelloImpl());             TCompactProtocol.FactoryproFac= newTCompactProtocol.Factory();             TFramedTransport.FactorytranFac= newTFramedTransport.Factory();            TNonblockingServer.Argsargs= newTNonblockingServer.Args(serverTran);             args.processor(pro);             args.protocolFactory(proFac);             args.transportFactory(tranFac);                         TServerserver = newTNonblockingServer(args);             server.serve();// 啟動server     
  • 源碼中服務端套接字的建立源碼如下:

 publicTNonblockingServerSocket(NonblockingAbstractServerSocketArgsargs ) throwsTTransportException {    clientTimeout_= args.clientTimeout;    try{      serverSocketChannel= ServerSocketChannel. open();// 熟悉吧!NIO方式的      serverSocketChannel.configureBlocking(false);// NIO的非阻塞設定

     // Make server socket      serverSocket_= serverSocketChannel.socket();      // Prevent 2MSL delay problem on server restarts      serverSocket_.setReuseAddress(true);      // Bind to listening port      serverSocket_.bind(args.bindAddr,args.backlog);     }catch(IOException ioe) {      serverSocket_= null;      thrownew TTransportException("Could not create ServerSocket on address "+args.bindAddr.toString() +".");     }   }

  總之,從上面可以看出大家還是圍繞JDK的NET、NIO在文章。了解了JDK的基本Socket通信基礎,則使用這些的架構就非常容易了解,包括netty底層的一些構造。看來知識都是相通的。