Thrift是一種接口描述語言和二進制通訊協議,它被用來定義和創建跨語言的服務。它被當作一個遠程過程調用(RPC)框架來使用,是由Facebook為“大規模跨語言服務開發”而開發的。
軟件介紹
Thrift由C++編寫,但可以為眾多語言創建代碼。要創建一個Thrift服務,必須寫一些Thrift文件來描述它,為目標語言生成代碼,并且寫一些代碼來啟動服務器及從客戶端調用它。
Thrift將由這個描述信息生成獨立的代碼。例如,在Java里,PhoneType將是Phone類中一個簡單的enum。
發展歷程
thrift最初由facebook開發用做系統內各語言之間的RPC通信。2007年由facebook貢獻到apache基金,08年5月進入apache孵化器。支持多種語言之間的RPC方式的通信:PHP語言client可以構造一個對象,調用相應的服務方法來調用java語言的服務,跨越語言的C/S RPC調用。
軟件架構
Thrift包含一套完整的棧來創建客戶端和服務端程序。頂層部分是由Thrift定義生成的代碼。而服務則由這個文件客戶端和處理器代碼生成。在生成的代碼里會創建不同于內建類型的數據結構,并將其作為結果發送。協議和傳輸層是運行時庫的一部分。有了Thrift,就可以定義一個服務或改變通訊和傳輸協議,而無需重新編譯代碼。除了客戶端部分之外,Thrift還包括服務器基礎設施來集成協議和傳輸,如阻塞、非阻塞及多線程服務器。棧中作為I/O基礎的部分對于不同的語言則有不同的實現。
Thrift支持眾多通訊協議:
TBinaryProtocol – 一種簡單的二進制格式,簡單,但沒有為空間效率而優化。比文本協議處理起來更快,但更難于調試。
TCompactProtocol – 更緊湊的二進制格式,處理起來通常同樣高效。
TDebugProtocol – 一種人類可讀的文本格式,用來協助調試。
TDenseProtocol – 與TCompactProtocol類似,將傳輸數據的元信息剝離。
TJSONProtocol – 使用JSON對數據編碼。
TSimpleJSONProtocol – 一種只寫協議,它不能被Thrift解析,因為它使用JSON時丟棄了元數據。適合用腳本語言來解析。
支持的傳輸協議有:
TFileTransport – 該傳輸協議會寫文件。
TFramedTransport – 當使用一個非阻塞服務器時,要求使用這個傳輸協議。它按幀來發送數據,其中每一幀的開頭是長度信息。
TMemoryTransport – 使用存儲器映射輸入輸出。(Java的實現使用了一個簡單的ByteArrayOutputStream)
TSocket – 使用阻塞的套接字I/O來傳輸。
TZlibTransport – 用zlib執行壓縮。用于連接另一個傳輸協議。
Thrift還提供眾多的服務器,包括:
TNonblockingServer – 一個多線程服務器,它使用非阻塞I/O(Java的實現使用了NIO通道)。TFramedTransport必須跟這個服務器配套使用。
TSimpleServer – 一個單線程服務器,它使用標準的阻塞I/O。測試時很有用。
TThreadPoolServer – 一個多線程服務器,它使用標準的阻塞I/O。
參見
自由軟件主題
數據序列化格式比較
Apache Avro
ASN.1(抽象語法標記一)
Caucho的Hessian
谷歌的Protocol Buffers
外部數據表示法
ZeroC的ICE
SDXF(結構化數據交換格式)
主要功能
Thrift的架構包括了其他幾種通訊協議和傳輸方式,以及服務器類型,這些在原有百科中未提及。例如,Thrift支持的通訊協議還包括TJSONProtocol,它使用JSON進行數據編碼,以及TSimpleJSONProtocol,一個只寫協議,不能被Thrift解析,因為它使用JSON丟棄元數據,適合腳本語言解析。在傳輸方式方面,Thrift還支持TMemoryTransport,使用內存進行I/O,Java實現內部使用簡單的ByteArrayOutputStream,以及TZlibTransport,使用zlib進行壓縮,與另一個傳輸方式一起使用。在服務器類型方面,Thrift還提供了TThreadedServer,使用每個連接模型一個線程的多線程服務器和標準阻塞I/O。
此外,Thrift的優點還包括語言綁定感覺自然,例如Java使用ArrayList
最后,Thrift的協議支持軟版本控制,不需要像主版本/次版本那樣的集中和明確的機制。松散耦合的團隊可以自由地演化RPC調用,沒有構建依賴或非標準軟件,也沒有不兼容軟件許可證的混合。
軟件優點
Thrift一些已經明確的優點包括:
跟一些替代選擇,比如SOAP相比,跨語言序列化的代價更低,因為它使用二進制格式。
它有一個又瘦又干凈的庫,沒有編碼框架,沒有XML配置文件。
綁定感覺很自然。例如,Java使用java.util.ArrayList
應用層通訊格式與序列化層通訊格式是完全分離的。它們都可以獨立修改。
預定義的序列化格式包括:二進制格式、對HTTP友好的格式,以及緊湊的二進制格式。
兼作跨語言文件序列化。
協議使用軟版本號機制軟件版本管理。Thrift不要求一個中心化的和顯式的版本號機制,例如主版本號/次版本號。松耦合的團隊可以輕松地控制RPC調用的演進。
沒有構建依賴也不含非標準化的軟件。不存在不兼容的軟件許可證混用的情況。
參考資料 >