一、Thrift介紹
Thrift
是一個輕量級、跨語言的遠程服務調用框架,最初由Facebook
開發,後面進入Apache
開源項目。主要包含三大部分:代碼生成、序列化框架、RPC框架,相當於protoc + protobuffer + grpc,並且支持大量語言(C++
、Go、Java
、Python
、PHP
、Ruby
等),是一套全棧式的RPC解決方案。整體架構圖:
二、Thrift的數據類型及IDL語法
基本類型:
- bool: 布爾值
- byte: 8位有符號整數
- i16: 16位有符號整數
- i32: 32位有符號整數
- i64: 64位有符號整數
- double: 64位浮點數
- string: UTF-8編碼的字符串
- binary: 二進制串
結構體類型:
- struct: 定義的結構體對象
容器類型:
- list: 有序元素列表
- set: 無序無重複元素集合
- map: 有序的key/value集合
異常類型:
- exception: 異常類型
服務類型:
- service: 具體對應服務的類
除此之外,Thrift 還支持枚舉類型(enum)和常量類型(const)
IDL語法參考:
三、通訊協議及序列化協議
Thrift
可以讓用戶選擇客戶端與服務端之間傳輸通信協議的類別,在傳輸協議上總體劃分爲文本(text
)和二進制(binary
)傳輸協議,主要有BinaryProtocol、CompactProtocol、JsonProtocol、MultiplexedProtocol,一般實現RPC最常用協議BinaryProtocol和CompactProtocol。常用協議有以下幾種:
- TBinaryProtocol:二進制編碼格式進行數據傳輸
- TCompactProtocol:高效率的、密集的二進制編碼格式進行數據傳輸
- TJSONProtocol: 使用
JSON
文本的數據編碼協議進行數據傳輸 - TSimpleJSONProtocol:只提供
JSON
只寫的協議,適用於通過腳本語言解析
四、Thrift 網絡棧
- Server
- 創建 transport
- 爲 transport 創建一個輸入/輸出 protocol
- 基於 輸入/輸出 protocol 創建一個 processor
- 等待連接並處理
- Processor
- 從輸入流讀取數據並寫到輸出流
- Protocol
- 協議層可以理解爲主要負責序列化和反序列化,是與 Proto Buf 可類比的層
- 常用的有 binary、compact:
- Transport
- 通常使用基於 Raw TCP 的傳輸協議,包括 Buffered 和 Framed 的;
- 一般包含打開鏈接、關閉鏈接、讀寫數據、監聽鏈接等接口和功能;