前言:由於最近在看storm Topology提交過程的源代碼,寫好的topology jar文件是通過Thrift RPC的形式提交給nimbus的。故了解下Thrift的基本原理。
參考:http://dongxicheng.org/search-engine/thrift-rpc/
1,環境:Ubuntu12.04 thrift-0.9.2。安裝:
①下載安裝包並解壓,假設解壓到/usr/lcoal/thrift-0.9.2/
②安裝依賴
sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev
3,在/usr/lcoal/thrift-0.9.2/運行如下命令:
./configure && make && make install
奇怪的是這里報了個錯誤:
thrift-t_gv_generator.o: file not recognized: File truncated
collect2: ld returned 1 exit status
make[3]: *** [thrift] 錯誤 1
make[3]:正在離開目錄 `/usr/local/thrift-0.9.2/compiler/cpp'
找到出錯的文件,發現它的大小為0,然后直接把它移除,再重新運行第 3 步中的命令。安裝成功。
4,Using Thrift with Java..在JAVA中使用Thrift,這里需要Java Thrift 庫。該java Thrift庫的編譯非常簡單:
參考:http://thrift.apache.org/lib/java。。。
在/usr/lcoal/thrift-0.9.2/lib/java/ 下運行 ant 即可,生成了一個libthrift-0.9.2.jar文件,就可以把該jar包導入到java工程中作為Thrift for java的依賴包了。
補充一下:在由Thrift IDL語言定義好**.thrift 文件,運行 thrift --gen java **.thrift 就可以生成相應的JAVA文件。把該JAVA文件導入到JAVA工程中,還需要slf4j-api-1.5.8.jar 、slf4j-log4j12-1.5.8.jar 、log4j-1.2.14.jar
5,Thrift for java 之 eclipse編程實例
參考:http://blog.csdn.net/jun55xiu/article/details/8988429
①定義好thrift文件--Hello.thrift 並生成相應的java代碼
thrift文件如下:
service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) }
生成的java部分代碼如下:
public class Hello { public interface Iface { public String helloString(String para) throws org.apache.thrift.TException; public int helloInt(int para) throws org.apache.thrift.TException; } public interface AsyncIface { public void helloString(String para, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
②編寫HelloServiceImpl接口實現thrift文件中定義的服務
import org.apache.thrift.TException; public class HelloServiceImpl implements Hello.Iface{ public String helloString(String para) throws TException { return para; } public int helloInt(int para) throws TException { try{ Thread.sleep(2000); }catch(InterruptedException e){ e.printStackTrace(); } return para; } }
③編寫服務器端程序,部分代碼如下:
TServerSocket serverTransport = new TServerSocket(7911);//設置服務器端口 Factory proFactory = new TBinaryProtocol.Factory();//設置協議工廠 TProcessor processor = new Hello.Processor<Hello.Iface>(new HelloServiceImpl());//關聯處理器與Hello.thrift文件中定義的服務的實現 TServer.Args tArgs = new TServer.Args(serverTransport); tArgs.processor(processor); tArgs.protocolFactory(proFactory); TServer server = new TSimpleServer(tArgs); System.out.println("Start server on port 7911"); server.serve();
④編寫客戶端程序
TTransport transport = new TSocket("localhost",7911);//建立連接 transport.open(); TProtocol protocol = new TBinaryProtocol(transport); Hello.Client client = new Hello.Client(protocol);//生成客戶端實例對象 client.helloString("Hello World");//調用定義好的服務 client.helloInt(88);//調用定義好的服務
⑤總結:
1,使用IDL語言寫好接口定義thrift文件,該文件指明了服務器端提供的各種服務。2,通過thrift --gen java/c++/py/... <thrift file> 生成相應語言的代碼。
3,用戶實現具體的服務--服務器端程序、客戶端程序。。。客戶端調用服務,服務器端提供服務。
4,至於整個傳輸過程則被Thrift封裝起來了--protocol 定義數據傳輸格式,transport 定義數據傳輸方式。