1. 程式人生 > >使用Java快速入門Thrift

使用Java快速入門Thrift

Apache Thrift是一個facebook建立的RPC框架,現在是一個Apache的頂級專案。Thrift允許通過一個跨語言的定義檔案的方式定義資料型別和服務介面,這個檔案作為RPC客戶端和伺服器通訊的標準,你也可以去看看Thrift的白皮書瞭解更多資訊。

根據Apache Thrift的官方站點的描述,Thrift是一個:

software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.
 
安裝Thrift比較的煩,但是在Windows下官方編譯了一個thrift.exe,下載安裝就行了。 

寫 Thrift定義檔案(.thrift file)

如果你之前有接觸過這個東西的話,寫定義檔案非常的簡單。但這裡可以參考官方的教程快速開始。

示例定義檔案(add.thrift)

namespace java com.eviac.blog.samples.thrift.server  // defines the namespace   
   
typedef i32 int //typedefs to get convenient names for your types  
   
service AdditionService {  // defines the service to add two numbers  
        intadd(1:intn1, 2:intn2), //defines a method  
}

編譯Thrift定義檔案

下面的命令編譯.thrift檔案

thrift --gen <language> <Thrift filename>

對於我的例子來講,命令是:

thrift --gen java add.thrift

在執行完程式碼後,在gen-java目錄下你會發現構建RPC伺服器和客戶端有用的原始碼。在我的例子中我將建立一個叫做AddtionService.java的java檔案。

寫一個 service handler

Service handler 類必須實現 AdditionService.Iface介面。
示例Service handler(AdditionServiceHandler.java)

package com.eviac.blog.samples.thrift.server;  
import org.apache.thrift.TException;  
   
public class AdditionServiceHandler implements AdditionService.Iface {  
 @Override 
 publicint add(intn1, intn2) throws TException {  
  returnn1 + n2;  
 } 
   
}

寫一個簡單的伺服器

下面的示例程式碼是一個簡單的Thrift伺服器。可以看到下面的程式碼中有一段是註釋了的,可以去掉註釋來啟用多執行緒伺服器。
示例伺服器(MyServer.java)

package com.eviac.blog.samples.thrift.server;  
   
import org.apache.thrift.transport.TServerSocket;  
import org.apache.thrift.transport.TServerTransport;  
import org.apache.thrift.server.TServer;  
import org.apache.thrift.server.TServer.Args;  
import org.apache.thrift.server.TSimpleServer;  
   
public class MyServer {  
   
 public static void StartsimpleServer(AdditionService.Processor<AdditionServiceHandler> processor) { 
  try{  
   TServerTransport serverTransport = new TServerSocket(9090); 
   TServer server = new TSimpleServer(  
     newArgs(serverTransport).processor(processor));  
   
   // Use this for a multithreaded server  
   // TServer server = new TThreadPoolServer(new  
   // TThreadPoolServer.Args(serverTransport).processor(processor));  
   
   System.out.println("Starting the simple server..."); 
   server.serve(); 
  }catch(Exception e) {  
   e.printStackTrace(); 
  } 
 } 
    
 public static void main(String[] args) {  
  StartsimpleServer(new AdditionService.Processor<AdditionServiceHandler>(new AdditionServiceHandler()));  
 } 
   
}

寫一個客戶端

下面的例子是一個使用Java寫的客戶端短使用AdditionService的服務。

package com.eviac.blog.samples.thrift.client;  
   
import org.apache.thrift.TException;  
import org.apache.thrift.protocol.TBinaryProtocol;  
import org.apache.thrift.protocol.TProtocol;  
import org.apache.thrift.transport.TSocket;  
import org.apache.thrift.transport.TTransport;  
import org.apache.thrift.transport.TTransportException;  
   
public class AdditionClient {  
   
 public static void main(String[] args) {  
   
  try{  
   TTransport transport;  
   
   transport = new TSocket("localhost",9090); 
   transport.open(); 
   
   TProtocol protocol = new TBinaryProtocol(transport);  
   AdditionService.Client client = new AdditionService.Client(protocol);  
   
   System.out.println(client.add(100,200)); 
   
   transport.close(); 
  }catch(TTransportException e) {  
   e.printStackTrace(); 
  }catch(TException x) {  
   x.printStackTrace(); 
  } 
 } 
   
}

執行服務端程式碼(MyServer.java)將會看到下面的輸出。

Starting the simple server...

然後執行客戶端程式碼(AdditionClient.java),將會看到如下輸出。

300