thrift入門介紹



介紹

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

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

架構圖



數據類型

1、基本類型編程

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

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類型

2、結構體類型

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

※不支持繼承

3、容器類型

list:列表。對應 Java 的 ArrayList

set:集合。對應 Java 的 HashSet

map:對應 Java 的 HashMap

4、異常類型

exception:對應 Java 的 Exception

5、服務類型

service:對應服務的類

※支持繼承

6、常量

const 類型 變量名=值

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

7、類型定義

typedef i32 MyInteger

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

8、枚舉類型

enum EnumType

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

9、其餘

註釋

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

命名空間

namespacejava com.kongfz.pm

說明:a、namespace爲關鍵字

b、java爲語言定義

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

文件包含

include"othre.thrift"

10、


協議

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與其餘傳輸方式的比較:

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

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

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

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

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

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

相關文章
相關標籤/搜索