Thrift 是一個輕量級、跨語言的開源RPC框架,并且能夠根據(jù) *.thrift 文件自動生成聯(lián)合代碼。Thrift 提供了整潔的數(shù)據(jù)傳輸、序列化和應用層處理。通過簡單的接口定義語言,生成跨語言的的程序代碼,該代碼通過抽象棧構建了可供 RPC 使用的 Client 和 Server。開發(fā)者可以在生成的 Client 和 Sever 代碼的基礎上去實現(xiàn)自己的業(yè)務邏輯。
本文主要從 PHP 開發(fā)者的角度,去介紹 Thrift 的架構、開發(fā)和部署。
IDL:接口定義文件
接口定義文件是 Thrift 開發(fā)的核心,定義了 RPC 過程中通信的數(shù)據(jù)結構和通信的接口方法定義等。
詳細的接口定義可參考:
Thrift interface description language
以下部分可以對照 tutorial.thrift 文件查看。
數(shù)據(jù)類型
Thrift 腳本可定義的數(shù)據(jù)類型包括以下幾種類型:
基本類型:
因為 PHP 本身是弱類型的,所以這個主要是為了針對其他語言。
bool:1 位的布爾值,true 或 false,對應 Java 的 boolean
byte:8 位有符號整數(shù),對應 Java 的 byte
i16:16 位有符號整數(shù),對應 Java 的 short
i32:32 位有符號整數(shù),對應 Java 的 int
i64:64 位有符號整數(shù),對應 Java 的 long
double:64 位浮點數(shù),對應 Java 的 double
string:未知編碼文本或二進制字符串,對應 Java 的 String
binary:Blob字節(jié)數(shù)組
結構體類型:
struct:定義公共的對象,類似于 C 語言中的結構體定義。在php中是一個對象,在 Java 中是一個 JavaBean
容器類型:
list:一種類型的有序鏈表,對應 Java 的 ArrayList,PHP的數(shù)組。
set:一種類型的獨立元素集合,對應 Java 的 HashSet。PHP 不支持集合,會當成 List。
map:對應 Java 的 HashMap,PHP 中的關聯(lián)數(shù)組。
異常類型:
exception:就是 Exception。
服務類型:
service:對應服務的類和方法定義,參數(shù)及返回類型,可以返回 void 類型。關鍵字 oneway 可以加在沒有返回的方法前,比如沒有返回值的方法,就可以不用去等待服務器返回了。
Thrift 的調(diào)用棧
+-------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+
傳輸層 Transport
Thrift 實現(xiàn)的PHP 傳輸層相對其他語言要簡單,不包括像 TNonblockingTransport(使用非阻塞方式,用于構建異步客戶端)。對應 PHP 傳輸層源代碼在 lib/php/lib/Thrift/Transport,主要包括以下:
TSocket -- 使用阻塞式 I/O 進行傳輸,是最常見的模式
TFramedTransport -- 使用非阻塞方式,按塊的大小進行傳輸,類似于 Java 中的 NIO
協(xié)議 Protocol
可以在 Thrift 代碼中找到可以選擇的通信協(xié)議,比如 php可用的協(xié)議在源碼包的 lib/php/lib/Thrift/Protocol 目錄。建議選擇傳輸數(shù)據(jù)采用二進制格式,相對 JSON 體積更小,對于高并發(fā)、大數(shù)據(jù)量和多語言的環(huán)境更有優(yōu)勢。
TBinaryProtocol -- 二進制編碼格式進行數(shù)據(jù)傳輸
TCompactProtocol -- 高效率的、密集的二進制編碼格式進行數(shù)據(jù)傳輸
TJSONProtocol -- 使用 JSON 的數(shù)據(jù)編碼協(xié)議進行數(shù)據(jù)傳輸
TMultiplexedProtocol --多路復用
處理層 Processor
負責輸入輸出數(shù)據(jù)處理的接口,對 Protocol 的處理。(該部分代碼會根據(jù) Thrift 的接口定義文件自動生成)
服務器 Server
對應 PHP 服務器代碼在 lib/Thrift/Server。
TSimpleServer -- 單線程服務器端使用標準的阻塞式 I/O
TServerSocket.php -- Socket 實現(xiàn)
TForkingServer.php -- 多進程實現(xiàn)
理解以上就可以寫自己的 Thrift RPC服務和客戶端了,可以參考 thrift 的教程。這個是我寫的一個demo。