Thrift 安裝及使用


前言:由於最近在看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 定義數據傳輸方式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM