昨天總結了thrift的安裝和入門實例,Thrift入門初探--thrift安裝及java入門實例,今天開始總結一下thrift的相關基礎知識.html
Thrift使用一種中間語言IDL,來進行接口的定義,下面來具體講一下IDL可定義的幾種經常使用數據類型和關鍵字.java
thrift不支持無符號的類型,無符號類型能夠簡單理解爲不能表示負數,只能表示正數的類型,像java的基本數據類型都是有符號的類型.數組
- byte:有符號字節
- i32:32位有符號整數,此外還有i16,i64
- double:64位浮點數
- string:二進制字符串
- bool 布爾值 true或false
相似於c語言的結構體定義,在java中會被轉化爲javabean類服務器
struct User {
1: i32 id;
2: string name;
3: double salary;
4: bool hasCar;
}網絡
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 RequestException {負載均衡
1:i32 code;框架
2:string detail;異步
}
集合中的元素能夠是除了service以外的任意類型
list<T>:有序列表,元素可重複
set<T>:無需集合,元素不可重複
map<K,V>:鍵值對集合
enum Color{
RED,
BLUE
}
能夠理解成java中的packet,用於避免一些代碼衝突,每種語言都有屬於本身的命名空間的方式,好比java語言,就可使用java語言的格式
namespace
java com.wang.project
此外還有一些語言特性和關鍵字就不一一介紹了,好比可選參數和必選參數,required和optional,定義常量const,引入文件include等
Thrift支持多種傳輸協議,咱們能夠根據本身的須要來選擇合適的類型,整體上來講,分爲文本傳輸和二進制傳輸,因爲二進制傳輸在傳輸速率和節省帶寬上有優點,因此大部分狀況下使用二進制傳輸是比較好的選擇.
- TBinaryProtocol:使用二進制編碼格式傳輸,是thrift的默認傳輸協議
- TCompactProtocol:使用壓縮格式傳輸
- TJSONProtocol :使用JSON格式傳輸
- TDebugProtocol – 使用易懂可讀的文本格式進行傳輸,以便於debug
- TSimpleJSONProtocol – 提供JSON只寫的協議,適用於經過腳本語言解析
Thrift封裝了一層傳輸層來支持底層的網絡通訊,在Thrift中稱爲Transport,不只提供open,close,flush等方法,還有一些read/write方法.
- TSocket:阻塞式IO的Transport實現,用在客戶端.
- TServerSocket:非阻塞式Socket,用於服務器端,用於監聽TSocket.
- TNonblockingSocket:非阻塞式IO的實現
- TMemoryInputTransport: 封裝了一個字節數組byte[]來作輸入流的封裝
- TFramedTransport- 一樣使用非阻塞方式,按塊的大小進行傳輸,輸入流封裝了TMemoryInputTransport
TSimpleServer:
這種工做模式只有一個線程,循環監聽傳過來的請求並對其進行處理,處理完才能接受下一個請求,是一種阻塞式IO的實現,由於效率比較低,實際線上環境通常用不到.通常用於開發時候演示工做流程時使用.
TNonblockingServer:
這種模式與TsimpleServer最大的區別就是使用NIO,也就是非阻塞是IO的方式實現IO的多路複用,它能夠同時監聽多個socket的變化,但由於業務處理上仍是單線程模式,因此在一些業務處理比較複雜耗時的時候效率仍是不高,由於多個請求任務依然須要排隊一個一個進行處理.
TThreadPoolServer:
這種模式引入了線程池,主線程只負責accept,即監聽Socket,當有新的請求(客戶端Socket)來時,就會在線程池裏起一個線程來處理業務邏輯,這樣在併發量比較大的時候(但不超過線程池的數量)每一個請求都能及時被處理,效率比較高,但一旦併發量很大的時候(超過線程池數量),後面來的請求也只能排隊等待.
TThreadedSelectorServer:
這是一種多線程半同步半異步的服務模型,是Thrift提供的最複雜最高級的服務模型,內部有一個專門負責處理監聽Socket的線程,有多個專門處理業務中網絡IO的線程,有一個專門負責決定將新Socket鏈接分配給哪個線程處理的起負載均衡做用的線程,還有一個工做線程池.這種模型既能夠響應大量併發鏈接的請求又能夠快速對wangluoIO進行讀寫,能適配不少場景,所以是一種使用比較高頻的服務模型.
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.啓動服務
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(); } }
新手入門,根據本身的理解以及拜閱了網友們的文章總結的不免有不當之處的,輕噴.