Thrift - 跨語言的 RPC 開發(fā)框架

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

Apache Thrift Features

Thrift Types

以下部分可以對照 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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容