apache thrift分析
thrift是一個用來實現跨語言的遠程調用(RPC Remote Procedure Call)的軟件框架。根據接口定義語言(IDL Interface definition lanuage) 并借助自身的協議棧和代碼生成引擎來生成各種主流語言(C/C++,PYTHON,JAVA,GOLANG,PHP等)的rpc框架的服務端/客戶端代碼,使得在不同的語言之間可以提供高效的服務。
一:IDL支持的數據類型
- bool 布爾型
 - byte 8位整數
 - i16 16位整數
 - i32 32位整數
 - i64 64位整數
 - double 雙精度浮點數
 - string 字符串
 - binary 字節數組
 - list<i16> List集合
 - map<string, string> Map類型
 - set<i32> Set集合
 
?
二: thrift 架構
服務端
 +--------------------------------------------+ 
 | Server? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
 | (single-threaded, event-driven etc) |
 +-------------------------------------------+
 | Processor? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
 | (compiler generated)? ? ? ? ? ? ? ? ? ?|
 +-------------------------------------------+
 | Protocol? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
 | (JSON, compact etc)? ? ? ? ? ? ? ? ? ?|
 +-------------------------------------------+
 | Transport? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
 | (raw TCP, HTTP etc)? ? ? ? ? ? ? ? ? ?|
 +-------------------------------------------+
 | 底層IO Socket/File/Zip? ? ? ? ? ? ? ? |
+-------------------------------------------+
客戶端
 +-------------------------------------------+
 | Client? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
 +-------------------------------------------+
 | Processor? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
 | (compiler generated)? ? ? ? ? ? ? ? ? ?|
 +-------------------------------------------+
 | Protocol? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
 | (JSON, compact etc)? ? ? ? ? ? ? ? ? ?|
 +-------------------------------------------+
 | Transport? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
 | (raw TCP, HTTP etc)? ? ? ? ? ? ? ? ? ?|
 +-------------------------------------------+
 | 底層IO Socket/File/Zip? ? ? ? ? ? ? ? |
+-------------------------------------------+
?
1、底層IO模塊,負責實際的數據傳輸,包括socket,文件或者壓縮數據流等
2、Transport 負責以字節流的方式發送和接收數據,是底層IO模塊在thrift框架中的實現,每一個底層IO模塊都會有一個對應TTransport來負責Thrift的字節流(Byte Stream)數據在該IO模塊上的傳輸。例如TSocket對應Socket傳輸,TFileTransport對應文件傳輸。
3、Protocol(或TProtocol)主要負責結構化數據組裝,或者從結構中讀出結構化數據。TProtocol將一個有類型的數據轉化為字節流以交給TTransport進行傳輸,或者從TTransport中讀取一定長度的字節數據轉化為特定類型的數據。如int32會被TBinaryProtocol Encode為一個四字節的字節數據,或者TBinaryProtocol從TTransport中取出四個字節的數據Decode為int32。
4、Processor(或者TProcessor)負責對Client的請求做出響應,包括RPC請求轉發,調用參數解析和用戶邏輯調用,返回值寫回等處理步驟。Processor是服務器端從Thrift框架轉入用戶邏輯的關鍵流程
5、TServer負責接收Client的請求,并將請求轉發到Processor進行處理。TServer主要任務就是高效的接受Client的請求,特別是在高并發請求的情況下快速完成請求
?
Thrift的模塊設計非常好,在每一個層次都可以根據自己的需要選擇合適的實現方式
Transport
transport這一層提供了一個抽象層,從網絡上讀取,發送數據。 這一層并不解析數據的類型,它只是一個字節一個字節的讀取和發送數據
transport支持的幾種傳輸類型:
1. TSocket 使用阻塞的Socket進行IO傳輸
2. TFramedTransport 使用一個帶Buffer的Socket進行IO傳輸,使用NoblockingServer的時候會需要使用TFramedTransport
3. TFileTransport 使用文件進行IO傳輸
4. TZlibTransport 與其他的TTransport配合使用,完成數據的壓縮傳輸
?
Protocol
Protocol的主要任務是把Transport中的字節流轉化為數據流(Data Stream),在Protocol這一層就會出現具有數據類型的數據,如整型,浮點數,字符串,結構體等
Protocol中數據雖然有了數據類型,但是Protocol只會按照指定類型將數據讀出和寫入,而對于數據的真正用途,需要在Thrift自動生成的Server和Client中里處理
Protocol支持的幾種主要協議類型為:
1. TBinaryProtocol 所有數據直接按照二進制方式編碼
2. TCompactProtocol 高效的編碼方式,使用了類似于ProtocolBuffer的Variable-Length Quantity (VLQ) 編碼方式,主要思路是對整數采用可變長度,同時盡量利用沒有使用Bit。
3. TDenseProtocol 類似于TCompactProtocol,但是傳輸過程中移除數據的Meta信息
4. TJSONProtocol 使用JSON編碼數據
5. TSimpleJSONProtocol 只寫方式的JSON編碼,適合腳本語言的解析
6. TDebugProtocol 文本方式編碼數據,主要用于調試
?
Processor
Processor是由Thrift生成的TProcessor的子類,主要對TServer中一次請求的 InputProtocol和OutputTProtocol進行操作,也就是從InputProtocol中讀出Client的請求數據,向OutputProtcol中寫入用戶邏輯的返回值。Processor是TServer從Thrift框架轉到用戶邏輯的關鍵流程。同時TProcessor.process是一個非常關鍵的處理函數,因為Client所有的RPC調用都會經過該函數處理并轉發
?
Server
Server在Thrift框架中的主要任務是接收Client的請求,并轉到某個TProcessor上進行請求處理。針對不同的訪問規模, Thrift提供了不同的TServer模型。Thrift目前支持的Server模型包括:
1. TSimpleServer 使用阻塞IO的單線程服務器,主要用于調試
2. TThreadedServer 使用阻塞IO的多線程服務器。每一個請求都在一個線程里處理,并發訪問情況下會有很多線程同時在運行。
3. TThreadPoolServer 使用阻塞IO的多線程服務器,使用線程池管理處理線程。
4. TNonBlockingServer 使用非阻塞IO的多線程服務器,使用少量線程既可以完成大并發量的請求響應。該類型Server必須使用TFramedTransport。
?
Client
Client跟TProcessor一樣都主要操作InputProtocol和OutputProtocol,不同的是Client將RPC調用分為Send和receive兩個步驟。
1. Send步驟,將用戶的調用參數作為一個整體的Struct寫入TProcotol,并發送到TServer。
2. Send結束之后,Client便立刻進入Receive狀態等待TServer的相應。對于TServer返回的響應,使用返回值解析類進行返回值解析,完成RPC調用。
?
參考資料:
 http://thrift.apache.org/docs/
 https://developers.google.com/protocol-buffers/docs/encoding
 http://thrift.apache.org/tutorial/
 http://thrift.apache.org/static/files/thrift-20070401.pdf
 https://blog.csdn.net/column/details/thrift.html
轉載于:https://www.cnblogs.com/jiujuan/p/9347216.html
總結
以上是生活随笔為你收集整理的apache thrift分析的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 求一个骚气的个性签名!
 - 下一篇: 发动机机脚胶(垫)多久要更换?机脚胶坏了