Thrift入門初探(2)--thrift基礎知識詳解

  昨天總結了thrift的安裝和入門實例,Thrift入門初探--thrift安裝及java入門實例,今天開始總結一下thrift的相關基礎知識.html

  Thrift使用一種中間語言IDL,來進行接口的定義,下面來具體講一下IDL可定義的幾種經常使用數據類型和關鍵字.java

經常使用數據類型及關鍵字

  基本類型

    thrift不支持無符號的類型,無符號類型能夠簡單理解爲不能表示負數,只能表示正數的類型,像java的基本數據類型都是有符號的類型.數組

  • byte:有符號字節
  • i32:32位有符號整數,此外還有i16,i64
  • double:64位浮點數
  • string:二進制字符串
  • bool 布爾值 true或false

  結構體類型(struct):

    相似於c語言的結構體定義,在java中會被轉化爲javabean類服務器

struct User {
  1: i32 id;
  2: string name;
  3: double salary;
  4: bool hasCar;
}網絡

  服務類型(service):

    service:對應服務的接口,內部可定義各類方法,至關於java中建立interface同樣,建立的service通過代碼生成命令會生成客戶端,服務端的框架代碼多線程

service Hello{
  string helloString(1:string s);
  i32 helloInt(1:i32 i);
  bool helloBoolean(1:bool b);
  void helloVoid();
  string helloNull();
}併發

  異常類型(Exception):

exception RequestException {負載均衡

  1:i32 code;框架

  2:string detail;異步

}

  容器類型

    集合中的元素能夠是除了service以外的任意類型

   list<T>:有序列表,元素可重複

   set<T>:無需集合,元素不可重複

   map<K,V>:鍵值對集合

  枚舉類型

  enum Color{

    RED,

    BLUE

  }

  命名空間(namespace)

    能夠理解成java中的packet,用於避免一些代碼衝突,每種語言都有屬於本身的命名空間的方式,好比java語言,就可使用java語言的格式

namespace java com.wang.project

   此外還有一些語言特性和關鍵字就不一一介紹了,好比可選參數和必選參數,required和optional,定義常量const,引入文件include等

Thrift支持的傳輸協議

  Thrift支持多種傳輸協議,咱們能夠根據本身的須要來選擇合適的類型,整體上來講,分爲文本傳輸和二進制傳輸,因爲二進制傳輸在傳輸速率和節省帶寬上有優點,因此大部分狀況下使用二進制傳輸是比較好的選擇.

  • TBinaryProtocol:使用二進制編碼格式傳輸,是thrift的默認傳輸協議
  • TCompactProtocol:使用壓縮格式傳輸
  • TJSONProtocol :使用JSON格式傳輸
  • TDebugProtocol – 使用易懂可讀的文本格式進行傳輸,以便於debug
  • TSimpleJSONProtocol – 提供JSON只寫的協議,適用於經過腳本語言解析

Thrift支持的傳輸模式

  Thrift封裝了一層傳輸層來支持底層的網絡通訊,在Thrift中稱爲Transport,不只提供open,close,flush等方法,還有一些read/write方法.

  •   TSocket:阻塞式IO的Transport實現,用在客戶端.
  •   TServerSocket:非阻塞式Socket,用於服務器端,用於監聽TSocket.
  •   TNonblockingSocket:非阻塞式IO的實現
  •   TMemoryInputTransport: 封裝了一個字節數組byte[]來作輸入流的封裝
  •   TFramedTransport- 一樣使用非阻塞方式,按塊的大小進行傳輸,輸入流封裝了TMemoryInputTransport  

Thrift支持的服務模型

  TSimpleServer:

    這種工做模式只有一個線程,循環監聽傳過來的請求並對其進行處理,處理完才能接受下一個請求,是一種阻塞式IO的實現,由於效率比較低,實際線上環境通常用不到.通常用於開發時候演示工做流程時使用.  

  TNonblockingServer:

    這種模式與TsimpleServer最大的區別就是使用NIO,也就是非阻塞是IO的方式實現IO的多路複用,它能夠同時監聽多個socket的變化,但由於業務處理上仍是單線程模式,因此在一些業務處理比較複雜耗時的時候效率仍是不高,由於多個請求任務依然須要排隊一個一個進行處理.

  TThreadPoolServer:

    這種模式引入了線程池,主線程只負責accept,即監聽Socket,當有新的請求(客戶端Socket)來時,就會在線程池裏起一個線程來處理業務邏輯,這樣在併發量比較大的時候(但不超過線程池的數量)每一個請求都能及時被處理,效率比較高,但一旦併發量很大的時候(超過線程池數量),後面來的請求也只能排隊等待.

  TThreadedSelectorServer:

    這是一種多線程半同步半異步的服務模型,是Thrift提供的最複雜最高級的服務模型,內部有一個專門負責處理監聽Socket的線程,有多個專門處理業務中網絡IO的線程,有一個專門負責決定將新Socket鏈接分配給哪個線程處理的起負載均衡做用的線程,還有一個工做線程池.這種模型既能夠響應大量併發鏈接的請求又能夠快速對wangluoIO進行讀寫,能適配不少場景,所以是一種使用比較高頻的服務模型.

Thrift服務層編碼

try {
            System.out.println("服務端開啓....");
            //1.建立TProcessor
            TProcessor tprocessor = new Hello.Processor<Hello.Iface>(new HelloServiceImpl());
            // 2.建立TserverTransport
            TServerSocket serverTransport = new TServerSocket(9898);
            //3.建立TProtocol
            TBinaryProtocol.Factory factory = new TBinaryProtocol.Factory();

            TServer.Args tArgs = new TServer.Args(serverTransport);
            tArgs.processor(tprocessor);
            tArgs.protocolFactory(factory);
            //4.建立Tserver,傳入須要的參數,server將以上內容集成在一塊兒
            TServer server = new TSimpleServer(tArgs);
            //5.啓動server
            server.serve();
            }catch (TTransportException e) {
            e.printStackTrace();
        }

根據代碼能夠看出服務端編碼基本流程:

  0.實現服務處理接口impl,重寫接口方法.

  1.建立TProcessor

  Processor封裝了從輸入數據流中讀數據和向數據流中寫數據的操做,與服務相關的Processor是由編譯器編譯IDL文件產生的,它的主要工做是:從鏈接中讀取數據,把處理交給用戶實現impl,最後把結果寫到鏈接上.

  2.建立serverTransport

  TServerSocket是ServerTransport的阻塞式IO的實現.它實現了監聽端口的做用,accept到的Socket類型都是客戶端的TSocket類型(阻塞式Socket).

  3.建立TProtocol

  TProtocol定義了基本的協議信息,包括傳輸什麼數據,如何解析傳輸的數據.   

  4.建立server

  根據須要選擇使用不一樣的服務模式,代碼中爲了演示只是用了最簡單TSimpleServer

  5.啓動服務

Thrift客戶端編碼

System.out.println("客戶端啓動....");
        TTransport transport = null;
        try {
            //1.建立TTransport
            transport = new TSocket("localhost", 9898, 30000);
            // 2.建立TProtocol  協議要和服務端一致
            TProtocol protocol = new TBinaryProtocol(transport);
            //3.建立Client 打開transport
            Hello.Client client = new Hello.Client(protocol);
            transport.open();
            //4.調用Client響應方法
            String result = client.helloString("哈哈");
            System.out.println("Thrify client result =: " + result);
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        } finally {
            if (null != transport) {
                transport.close();
            }
        }

   新手入門,根據本身的理解以及拜閱了網友們的文章總結的不免有不當之處的,輕噴.

相關博文

Thrift入門初探--thrift安裝及java入門實例

  參考資料

Thrift源碼分析(六)-- Transport傳輸層分析

和 Thrift 的一場美麗邂逅

thrift入門教程

相關文章
相關標籤/搜索