Apache Thrift 服務開發架構學習記錄

來源:互聯網
上載者:User

標籤:訊息   協議   ruby   字元   序號   地方   system   ini   hello   

  Apache Thrift 是 Facebook 實現的一種高效的、支援多種程式設計語言的遠程服務調用的架構。

前言:

     目前流行的服務調用方式有很多種,例如基於 SOAP 訊息格式的 Web Service,基於 JSON 訊息格式的 RESTful 服務等。其中所用到的資料轉送方式包括 XML,JSON 等,然而 XML 相對體積太大,傳輸效率低,JSON 體積較小,新穎,但還不夠完善。

     本文將介紹由 Facebook 開發的遠程服務調用架構 Apache Thrift,它採用介面描述語言定義並建立服務,支援可擴充的跨語言服務開發,所包含的代碼產生引擎可以在多種語言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等建立高效的、無縫的服務,其傳輸資料採用二進位格式,相對 XML 和 JSON 體積更小,對於高並發、大資料量和多語言的環境更有優勢。

   

使用Thrift和傳統的Corba之類的RPC架構並無太大差異,主要分為如下三個部分:

 

  1. 使用IDL定義提供的服務:主要用於服務介面和資料轉送對象(DTO)並且有一套自己的文法, Thrift中命名為thirft檔案,並且有一套自己的文法。
  2. 將IDL編譯成架構代碼
  3. 用戶端使用架構代碼調用遠程服務
  4. 服務端使用架構代碼實現介面,並提供服務

 

和傳統RPC架構一樣,Thrift架構提供資料轉送的服務,服務端和用戶端只需要關注業務即可;這一系列流程並沒有多大新穎的地方。

 

一個簡單的 Thrift 執行個體:

      首先介紹一個簡單的 Thrift 實現執行個體,快速直觀地瞭解什麼是 Thrift 以及如何使用 Thrift 構建服務。

建立一個簡單的服務 Hello。首先根據 Thrift 的文法規範編寫指令檔 Hello.thrift,代碼如下:

 namespace java service.demo  service Hello{   string helloString(1:string para)   i32 helloInt(1:i32 para)   bool helloBoolean(1:bool para)   void helloVoid()   string helloNull()  }

        其中定義了服務 Hello 的五個方法,每個方法包含一個方法名,參數列表和傳回型別。每個參數包括參數序號,參數類型以及參數名。

         Thrift 是對 IDL(Interface Definition Language) 描述性語言的一種具體實現。因此,以上的服務描述檔案使用 IDL 文法編寫。使用 Thrift 工具編譯 Hello.thrift,就會產生相應的 Hello.java 檔案。該檔案包含了在 Hello.thrift 檔案中描述的服務 Hello 的介面定義,即 Hello.Iface 介面,以及服務調用的底層通訊細節,包括用戶端的調用邏輯 Hello.Client 以及伺服器端的處理邏輯 Hello.Processor,用於構建用戶端和伺服器端的功能。

HelloServiceImpl.java

建立 HelloServiceImpl.java 檔案並實現 Hello.java 檔案中的 Hello.Iface 介面,代碼如下:

package service.demo;  import org.apache.thrift.TException;  public class HelloServiceImpl implements Hello.Iface {     @Override     public boolean helloBoolean(boolean para) throws TException {         return para;     }     @Override     public int helloInt(int para) throws TException {         try {             Thread.sleep(20000);         } catch (InterruptedException e) {             e.printStackTrace();         }         return para;     }     @Override     public String helloNull() throws TException {         return null;     }     @Override     public String helloString(String para) throws TException {         return para;     }     @Override     public void helloVoid() throws TException {         System.out.println("Hello World");     }  }

建立伺服器端實現代碼,將 HelloServiceImpl 作為具體的處理器傳遞給 Thrift 伺服器,代碼如下:

 HelloServiceServer.java
package service.server;  import org.apache.thrift.TProcessor;  import org.apache.thrift.protocol.TBinaryProtocol;  import org.apache.thrift.protocol.TBinaryProtocol.Factory;  import org.apache.thrift.server.TServer;  import org.apache.thrift.server.TThreadPoolServer;  import org.apache.thrift.transport.TServerSocket;  import org.apache.thrift.transport.TTransportException;  import service.demo.Hello;  import service.demo.HelloServiceImpl;  public class HelloServiceServer {     /**      * 啟動 Thrift 伺服器     * @param args      */     public static void main(String[] args) {         try {             // 設定服務連接埠為 7911             TServerSocket serverTransport = new TServerSocket(7911);             // 設定協議工廠為 TBinaryProtocol.Factory             Factory proFactory = new TBinaryProtocol.Factory();             // 關聯處理器與 Hello 服務的實現            TProcessor processor = new Hello.Processor(new HelloServiceImpl());             TServer server = new TThreadPoolServer(processor, serverTransport,                     proFactory);             System.out.println("Start server on port 7911...");             server.serve();         } catch (TTransportException e) {             e.printStackTrace();         }     }  }

建立用戶端實現代碼,調用 Hello.client 訪問服務端的邏輯實現,代碼如下:

HelloServiceClient.java
package service.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;  import service.demo.Hello;  public class HelloServiceClient {  /**      * 調用 Hello 服務     * @param args      */     public static void main(String[] args) {         try {             // 設定調用的服務地址為本地,連接埠為 7911             TTransport transport = new TSocket("localhost", 7911);             transport.open();             // 設定傳輸協議為 TBinaryProtocol             TProtocol protocol = new TBinaryProtocol(transport);             Hello.Client client = new Hello.Client(protocol);             // 調用服務的 helloVoid 方法            client.helloVoid();             transport.close();         } catch (TTransportException e) {             e.printStackTrace();         } catch (TException e) {             e.printStackTrace();         }     }  }

      代碼編寫完後運行伺服器,再啟動用戶端調用服務 Hello 的方法 helloVoid,在伺服器端的控制台視窗輸出“Hello World”(helloVoid 方法實現在控制台列印字串,沒有傳回值,所以用戶端調用方法後沒有傳回值輸出,讀者可以自己嘗試其他有傳回值方法的調用,其結果可以列印在用戶端的控制台視窗 )。

                     

Apache Thrift 服務開發架構學習記錄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.