thrift入門介紹



介紹

Apache Thrift 是Facebook 實現的一種高效的、支持多種編程語言的遠程服務調用的框架。它結合了功能強大的軟件堆棧和代碼生成引擎,以構建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa,JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。

最初由facebook開發,07年四月開放源碼,08年5月進入apache孵化器。

架構圖



數據類型

一、基本類型

bool:布爾值,true 或 false,對應 Java 的 Boolean

byte:8 位有符號整數,對應 Java 的 byte

i16:16 位有符號整數,對應 Java 的 short

i32:32 位有符號整數,對應 Java 的 int

i64:64 位有符號整數,對應 Java 的 long

double:64 位浮點數,對應 Java 的 double

string:未知編碼文本或二進制字符串,對應 Java 的 String

※在使用PHP時要注意i64類型

二、結構體類型

struct:定義公共的對象,類似於 C 語言中的結構體定義,在 Java 中是一個 JavaBean

※不支持繼承

三、容器類型

list:列表。對應 Java 的 ArrayList

set:集合。對應 Java 的 HashSet

map:對應 Java 的 HashMap

四、異常類型

exception:對應 Java 的 Exception

五、服務類型

service:對應服務的類

※支持繼承

六、常量

const 類型 變量名=值

※在java中會把定義的常量都生成到一個public類型的Constant類中

七、類型定義

typedef i32 MyInteger

※C/C++風格,java不支持

八、枚舉類型

enum EnumType

※不支持類型嵌套,枚舉常量必須是32位的正整數;

九、其他

註釋

支持#,/**/,//類型的註釋風格。建議使用/**/和//類型註釋。

命名空間

namespacejava com.kongfz.pm

說明:a、namespace爲關鍵字

b、java爲語言定義

c、com.kongfz.pm爲空間名稱,相當於java的package

文件包含

include"othre.thrift"

十、


協議

Thrift 可以讓用戶選擇客戶端與服務端之間傳輸通信協議的類別,在傳輸協議上總體劃分爲文本 (text) 和二進制 (binary) 傳輸協議,爲節約帶寬,提高傳輸效率,一般情況下使用二進制類型的傳輸協議爲多數,有時還會使用基於文本類型的協議,這需要根據項目 / 產品中的實際需求。常用協議有以下幾種:

TBinaryProtocol——進制編碼格式協議

TCompactProtocol——壓縮的二進制編碼格式協議

TJSONProtocol ——JSON格式的編碼格式協議

TSimpleJSONProtocol——只提供JSON 只寫的協議(適用於通過腳本語言解析)

TDebugProtocol——供開發調試使用


傳輸層

常用的傳輸層有一下幾種:

TSocket——使用阻塞式I/O進行傳輸。也是最常用模式;

TFrameTransport——非阻塞方式。以幀爲單位傳輸;

TNonblockingTransport——使用非阻塞方式,用於構建異步客戶端

TMemoryTransport- 使用內存I/O,就好比Java中的ByteArrayOutputStream實現。

TFileTransport——按照文件的方式傳輸,不支持java;

TZlibTransport- 使用執行zlib壓縮,不提供Java的實現

※②和③的區別:②的非阻塞方式是服務端非阻塞,客戶端是阻塞的;③是異步方式調用,客戶端需要使用回調函數來處理返回結果。

※應用最廣泛的是①、②和③


服務端類型

常見的服務端類型有:

TSimpleServer——單線程服務端使用標準的阻塞式I/O;


TThreadPoolServer——多線程服務端使用標準的阻塞式I/O;

※需要根據服務器的具體情況設置最大和最小線程數,以保證服務器最佳性能

TNonblockingServer——多線程服務端使用的非阻塞式I/O


命令

thrift-r --gen java xxx.thrift

其中:

thrift:是thrift的執行命令;

r:生成包含文件;

java:要生成代碼的語言;

gen:表示動態生成代碼的標誌;

xxx.thrift:thrift的定義文件

關鍵字

常用的關鍵字有:

required:在struct中定義時使用,表示該字段必須有值——系統檢查;

optional:在struct中定義時使用,表示該字段是可選的,有值也行無值也可;無值時不會被序列化、也不會被傳輸;

oneway:在service中修飾方法時使用,表示client發出請求後不必等待回覆,直接進行後面的操作。另外,該方法的返回值必須是void類型;

const:除了定義常量以外,可以修飾方法的參數,表示參數時只讀的,不能修改和返回。


比較

Thrift與其他傳輸方式的比較:

1、xml與JSON相比體積太大,但是xml傳統,也不算複雜;

2、json 體積較小,新穎,但不夠完善;

3、thrift 體積超小,使用起來比較麻煩,不如前兩者輕便,但是對於高併發、數據傳輸量大、多語言環境, 滿足其中2點使用 thrift還是值得的。

假定需要傳輸相同的內容,但使用不同的方式從 a、傳輸內容所產生的大小b、傳輸過程中服務端和客戶端所產生的開銷,這2個方便進行比較。

使用Thrift和其他方式的所產生的內容大小比較結果如下:

使用Thrift和其他方式的運行資源佔用比較:







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章