thrift遠端呼叫示例
阿新 • • 發佈:2019-02-07
說明
thrift是apache hadoop的一個子專案,主要是完成跨語言,跨平臺的序列化和遠端呼叫。具體的可以參考官方文件:
thrift.apache.org
安裝
thrift和上次介紹的protobuf一樣也需要安裝對應的編譯器,具體的安裝這裡不介紹了,可以參考:
http://thrift.apache.org/docs/install/
示例
這裡的例子,也是官方例子的簡化版,為了演示最基本的應用方式。弄明白實施要更深入研究的東西。
定義描述
thrift的示例工程和上次介紹的protobuf一樣,也可以直接在上面的工程中開發。
建立一個Calculator.thrift介面描述檔案。
namespace java com.wu.thrift service Calculator { void ping(), i32 add(1:i32 num1, 2:i32 num2) }
編譯生成stub
進入專案的src/main/java目錄,編譯thrift --gen java com/wu/thrift/Calculator.thrift
重新整理eclipse目錄,就能看到生成的檔案。
新增依賴
pom檔案中新增如下依賴<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.2</version>
</dependency>
編寫程式碼
編寫測試程式碼,分為客戶端、伺服器端客戶端package com.wu.thrift; import org.apache.thrift.TException; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TServer.Args; import org.apache.thrift.server.TSimpleServer; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TServerTransport; import org.apache.thrift.transport.TTransportException; public class Server2 { public static class CalculatorHandler implements Calculator.Iface{ @Override public void ping() throws TException { System.out.println("ping......"); } @Override public int add(int num1, int num2) throws TException { return num1+num2; } } public static void main(String[] args) throws TTransportException { //構建處理器 CalculatorHandler handler=new CalculatorHandler(); Calculator.Processor processor=new Calculator.Processor(handler); //構建伺服器 TServerTransport serverTransport = new TServerSocket(9090); TServer server=new TSimpleServer(new Args(serverTransport).processor(processor)); System.out.println("Starting the simple server..."); server.serve(); } }
package com.wu.thrift; 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; public class Client2 { public static void main(String[] args) throws TException { TTransport transport=new TSocket("localhost",9090); transport.open(); TProtocol protocol = new TBinaryProtocol(transport); Calculator.Client client = new Calculator.Client(protocol); client.ping(); int result=client.add(3, 2); System.out.println("計算結果:"+result); transport.close(); } }