Thrift最初是由Facebook開發的,由於隨着流量和網絡結構的擴展,一些操做如搜索、分發、事件日誌記錄等已經超出系統的處理範圍,因此Facebook的工程師開發服務時選擇了多種不一樣的編程語言來達到滿意的性能、快速開發、已有庫的重用。Thrift於2007年4月開源並於2008年5月進入Apache孵化器,在2010年10月成爲Apache TLP。apache
Thrift是一個可擴展的跨語言服務的軟件開發框架,目標是儘量高效和無縫地跨語言進行可靠的高性能通訊和數據序列化,Thrift經過中間語言(IDL, 接口定義語言)來定義RPC的接口和數據類型,利用代碼生成器生成不一樣語言的代碼(如C++,Java, Python, PHP. . .等),並由生成的代碼負責RPC協議層和傳輸層的實現。編程
Thrift網絡堆棧json
| Server | | (single-threaded, event-driven etc) | +-------------------------------------------+ | Processor | | (compiler generated) | +-------------------------------------------+ | Protocol | | (JSON, compact etc) | +-------------------------------------------+ | Transport | | (raw TCP, HTTP etc) | +-------------------------------------------+
傳輸(Transport)服務器
傳輸層爲網絡讀取/寫入網絡提供了一個簡單的抽象,這使得Thrift可以將底層傳輸與系統其它部分分離(如序列化/反序列化)。下面是一些Transport接口支持的方法網絡
● open 數據結構
● close 框架
● read 編程語言
● write 性能
● flush編碼
另外Thrift還提供了用於接收和建立基本Transport對象的ServerTransport接口。顧名思義,ServerTransport主要用於服務器端,爲傳入鏈接建立新的Transport對象。ServerTransport接口支持的方法
● open
● listen
● accept
● close
協議(Protocol)
協議層抽象定義了將內存數據結構映射爲傳輸格式的機制。換句話說,一個協議規定了數據類型如何使用Transport來對自身進行編碼/解碼。所以,協議實現管理編碼方案並負責序列化和反序列化。Protocol實現的一些例子包括JSON,XML,純文本,緊湊二進制等。
Protocol接口有
writeMessageBegin(name, type, seq) writeMessageEnd() writeStructBegin(name) writeStructEnd() writeFieldBegin(name, type, id) writeFieldEnd() writeFieldStop() writeMapBegin(ktype, vtype, size) writeMapEnd() writeListBegin(etype, size) writeListEnd() writeSetBegin(etype, size) writeSetEnd() writeBool(bool) writeByte(byte) writeI16(i16) writeI32(i32) writeI64(i64) writeDouble(double) writeString(string) name, type, seq = readMessageBegin() readMessageEnd() name = readStructBegin() readStructEnd() name, type, id = readFieldBegin() readFieldEnd() k, v, size = readMapBegin() readMapEnd() etype, size = readListBegin() readListEnd() etype, size = readSetBegin() readSetEnd() bool = readBool() byte = readByte() i16 = readI16() i32 = readI32() i64 = readI64() double = readDouble() string = readString()
Thrift的Protocol是面向流設計的,所以沒有必要去顯式分幀(framing)。好比,在開始序列化以前咱們能夠不用關心咱們傳輸的字符串長度或者列表中元素的個數。在Thrift支持的大部分編程語言中可供使用的Protocol類型有:
處理層(Processor)
處理層封裝了從輸入流中讀取數據並寫入輸出流的能力。Protocol對象即表明輸入流和輸出流。Processor接口很是簡單。
interface TProcessor { bool process(TProtocol in, TProtocol out) throws TException }
特定服務的Processor由編譯器自動生成實現。Processor經過輸入Protocol從網路上讀取數據,並將數據處理代理給用戶實現的Handler,最後經過輸出Protocol將數據寫回到網路上。
服務器層(server)
服務器層將上述全部各類功能聚集在一塊兒: