Thrift-java學習小結

聽雲APM發表於2016-07-27

原文出自【聽雲技術部落格】:http://blog.tingyun.com/web/article/detail/1083

Thrift是什麼?什麼情況下使用thrift

Thrift源於大名鼎鼎的facebook之手,在2007年facebook提交Apache基金會將Thrift作為一個開源專案,對於當時的facebook來說創造thrift是為了解決facebook系統中各系統間大資料量的傳輸通訊以及系統之間語言環境不同需要跨平臺的特性。所以thrift可以支援多種程式語言,例如: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多種不同的語言之間通訊thrift可以作為二進位制的高效能的通訊中介軟體,支援資料(物件)序列化和多種型別的RPC服務。Thrift是IDL(interface definition language)描述性語言的一個具體實現,Thrift適用於程式對程式靜態的資料交換,需要先確定好他的資料結構,他是完全靜態化的,當資料結構發生變化時,必須重新編輯IDL檔案,程式碼生成,再編譯載入的流程,跟其他IDL工具相比較可以視為是Thrift的弱項,Thrift適用於搭建大型資料交換及儲存的通用工具,對於大型系統中的子系統間資料傳輸相對於JSON和xml無論在效能、傳輸大小上有明顯的優勢。

Thrift 基礎架構

Thrift是一個服務端和客戶端的架構體系,就是socket傳輸,Thrift 具有自己內部定義的傳輸協議規範(TProtocol)和傳輸資料標準(TTransports),通過IDL指令碼對傳輸資料的資料結構(struct) 和傳輸資料的業務邏輯(service)根據不同的執行環境快速的構建相應的程式碼,並且通過自己內部的序列化機制對傳輸的資料進行簡化和壓縮提高高併發、 大型系統中資料互動的成本,下圖描繪了Thrift的整體架構,分為6個部分:1.你的業務邏輯實現(You Code) 2.客戶端和服務端對應的Service 3.執行讀寫操作的計算結果4.TProtocol 5.TTransports 6.底層I/O通訊

Thrift指令碼的資料型別

  • Base Types:基本型別

bool Boolean, one byte

byte Signed byte

i16 Signed 16-bit integer

i32 Signed 32-bit integer

i64 Signed 64-bit integer

double 64-bit floating point value

string String

binary Blob (byte array)

  • Struct:結構體型別

  • Container:容器型別,即List、Set、Map

map Map from one type to another

list Ordered list of one type

set Set of unique elements of one type

  • Exception:異常型別

  • Service: 定義物件的介面,和一系列方法

協議

Thrift可以讓你選擇客戶端與服務端之間傳輸通訊協議的類別,在傳輸協議上總體上劃分為文字(text)和二進位制(binary)傳輸協議, 為節約頻寬,提供傳輸效率,一般情況下使用二進位制型別的傳輸協議為多數,但有時會還是會使用基於文字型別的協議,這需要根據專案/產品中的實際需求:

  • TBinaryProtocol – 二進位制編碼格式進行資料傳輸。

  • TCompactProtocol – 這種協議非常有效的,使用Variable-Length Quantity (VLQ) 編碼對資料進行壓縮。

  • TJSONProtocol – 使用JSON的資料編碼協議進行資料傳輸。

  • TSimpleJSONProtocol – 這種節約只提供JSON只寫的協議,適用於通過指令碼語言解析

  • TDebugProtocol – 在開發的過程中幫助開發人員除錯用的,以文字的形式展現方便閱讀。

傳輸層

  • TSocket- 使用堵塞式I/O進行傳輸,也是最常見的模式。

  • TFramedTransport- 使用非阻塞方式,按塊的大小,進行傳輸,類似於Java中的NIO。

  • TFileTransport- 顧名思義按照檔案的方式程式傳輸,雖然這種方式不提供Java的實現,但是實現起來非常簡單。

  • TMemoryTransport- 使用記憶體I/O,就好比Java中的ByteArrayOutputStream實現。

  • TZlibTransport- 使用執行zlib壓縮,不提供Java的實現。

服務端型別

  • TSimpleServer - 單執行緒伺服器端使用標準的堵塞式I/O。

  • TThreadPoolServer - 多執行緒伺服器端使用標準的堵塞式I/O。

  • TNonblockingServer – 多執行緒伺服器端使用非堵塞式I/O,並且實現了Java中的NIO通道。

Thrift構建步驟總結(參考例項1)

1 、下載thrift.exe

到thrift官網下載,這裡我用的是0.9.3版本

http://thrift.apache.org/

2、將exe放到C:\Windows下(重新命名為thrift.exe)

3、C:\Windows建立.thrift檔案,編寫ThriftServer.thrift程式碼

4、在目錄下執行thrift.exe -r -gen java ./ThriftServer.thrift;執行成功後看到在該目錄下生成了gen-java資料夾,在該資料夾中生成了IThriftServer.java;

5、將IThriftServer.java拷貝到server端,進行後續編寫即可。

6、如果client和server端是跨應用,那麼需要server端先編譯打包成jar,將這個jar新增到client端的依賴中。

相關文章