原文出自【聽雲技術博客】:http://blog.tingyun.com/web/a...java
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不管在性能、傳輸大小上有明顯的優點。web
Thrift 基礎架構
Thrift是一個服務端和客戶端的架構體系,就是socket傳輸,Thrift 具備本身內部定義的傳輸協議規範(TProtocol)和傳輸數據標準(TTransports),經過IDL腳本對傳輸數據的數據結構(struct) 和傳輸數據的業務邏輯(service)根據不一樣的運行環境快速的構建相應的代碼,而且經過本身內部的序列化機制對傳輸的數據進行簡化和壓縮提升高併發、 大型系統中數據交互的成本,下圖描繪了Thrift的總體架構,分爲6個部分:1.你的業務邏輯實現(You Code) 2.客戶端和服務端對應的Service 3.執行讀寫操做的計算結果4.TProtocol 5.TTransports 6.底層I/O通訊apache
Thrift腳本的數據類型服務器
Base Types:基本類型數據結構
bool Boolean, one byte多線程
byte Signed byte架構
i16 Signed 16-bit integer併發
i32 Signed 32-bit integersocket
i64 Signed 64-bit integer高併發
double 64-bit floating point value
string String
binary Blob (byte array)
Struct:結構體類型
Container:容器類型,即List、Set、Map
map<t1,t2> Map from one type to another
list<t1> Ordered list of one type
set<t1> 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版本
二、將exe放到C:Windows下(重命名爲thrift.exe)
三、C:Windows建立.thrift文件,編寫ThriftServer.thrift代碼
四、在目錄下執行thrift.exe -r -gen java ./ThriftServer.thrift;執行成功後看到在該目錄下生成了gen-java文件夾,在該文件夾中生成了IThriftServer.java;
五、將IThriftServer.java拷貝到server端,進行後續編寫便可。
六、若是client和server端是跨應用,那麼須要server端先編譯打包成jar,將這個jar添加到client端的依賴中。