Thrift語法參考

一、Types

Thrift類型系統包括預約義基本類型,用戶自定義結構體,容器類型,異常和服務定義html

(1) 基本類型

bool: 布爾類型,佔一個字節java

byte: 有符號字節python

i16:16位有符號整型git

i32:32位有符號整型shell

i64:64位有符號整型框架

double:64位浮點數函數

string:未知編碼或者二進制的字符串post

注意:thrift不支持無符號整形,由於不少目標語言不存在無符號整形(好比java)ui

(2)容器類型

List<t1>:一系列t1類型的元素組成的有序列表,元素能夠重複編碼

Set<t1>:一些t1類型的元素組成的無序集合,元素惟一不重複

Map<t1,t2>:key/value對,key惟一

容器中的元素類型能夠是除service之外的任何合法的thrift類型,包括結構體和異常類型

(3)結構體和異常

Thrift結構體在概念上同c語言的結構體相似,在面嚮對象語言中,thrift結構體將被轉化爲類。

異常在語法和功能上相似於結構體,只是異常使用關鍵字exception而不是struct關鍵字來聲明。但它在語義上不一樣於結構體—當定義一個RPC服務時,開發者可能須要聲明一個遠程方法拋出一個異常。

(4)服務

Thrift中服務定義的方式和語法等同於面嚮對象語言中定義接口。Thrift編譯器會產生實現接口的client和server樁。

(5)類型定義

Thrift支持C/C++風格的typedef:

typedef i32 MyInteger   \\a 
typedef Tweet ReTweet  \\b

說明:

a.  末尾沒有逗號

b.   struct可使用typedef

 

二、枚舉類型

能夠像C/C++那樣定義枚舉類型,如:

enum TweetType {
 
TWEET,       //a
 
RETWEET = 2, //b
 
DM = 0xa,  //c
 
REPLY
 
}        //d
 
struct Tweet {
 
1: required i32 userId;
 
2: required string userName;
 
3: required string text;
 
4: optional Location loc;
 
5: optional TweetType tweetType = TweetType.TWEET // e
 
16: optional string language = "english"
 
}

說明:

a:編譯器默認從0開始賦值

b:能夠賦予某個常量

c:容許常量是十六進制整數

d:末尾沒有逗號

e:給常量賦缺省值時,使用常量的全稱

不一樣於protocol buffer,thrift不支持枚舉類嵌套,枚舉常量必須是32位正整數

 

三、註釋

Thrift支持shell註釋風格、C/C++語言中的單行或多行註釋風格

# This is a valid comment.
 
/*
 
* This is a multi-line comment.
 
* Just like in C.
 
*/
 
// C++/Java style single-line comments work just as well.
 

四、命名空間

Thrift中的命名空間同C++中的namespace和java中的package相似,它們均提供了一種組織(隔離)代碼的方式。由於每種語言均有本身的命名空間定義方式(如python中有module),thrift容許開發者針對特定語言定義namespace:
namespace cpp com.example.project  // a 
namespace java com.example.project // b

 

五、文件包含

Thrift容許文件包含,須要使用thrift文件名做爲前綴訪問被包含的對象,如:

include "tweet.thrift"           // a
 
...
 
struct TweetSearchResult {
 
1: list<tweet.Tweet> tweets; // b
 
}

說明:

a:thrift文件名須要雙引號包含,末尾沒有逗號或者分號

b:注意tweet前綴

 

六、常量

Thrift容許用戶定義常量,複雜的類型和結構體可使用JSON形式表示:

const i32 INT_CONST = 1234;    // a
 
const map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}

說明:

a:分號是可選的,支持十六進制賦值

 

七、定義結構體

struct Tweet {
 
1: required i32 userId;                  // a
 
2: required string userName;             // b
 
3: required string text;
 
4: optional Location loc;                // c
 
16: optional string language = "english" // d
 
}
 
struct Location {                            // e
 
1: required double latitude;
 
2: required double longitude;
 
}

說明:

a:每個域都有一個惟一的正整數標識符

b:每一個域能夠標識爲required或者optional(也能夠不註明)

c:結構體能夠包含其餘結構體

d:域能夠有缺省值

e:一個thrift中能夠定義多個結構體,並存在引用關係

規範的struct定義中的每一個域均會使用required或者optional關鍵字進行標識。若是required標識的域沒有賦值,thrift將給予提示。若是optional標識的域沒有賦值,該域將不會被序列化傳輸。若是某個optional標識域有缺省值而用戶沒有從新賦值,則該域的值一直爲缺省值。
與service不一樣,結構體不支持繼承,即,一個結構體不能繼承另外一個結構體。

 

八、定義服務

在流行的序列化/反序列化框架(如protocol buffer)中,thrift是少有的提供多語言間RPC服務的框架。
Thrift編譯器會根據選擇的目標語言爲server產生服務接口代碼,爲client產生樁代碼。

//「Twitter」與「{」之間須要有空格!!!
service Twitter {
 
// 方法定義方式相似於C語言中的方式,它有一個返回值,一系列參數和可選的異常
 
// 列表. 注意,參數列表和異常列表定義方式與結構體中域定義方式一致.
 
void ping(),                                    // a
 
bool postTweet(1:Tweet tweet);                  // b
 
TweetSearchResult searchTweets(1:string query); // c
 
// 」oneway」標識符表示client發出請求後沒必要等待回覆(非阻塞)直接進行下面的操做,
 
// 」oneway」方法的返回值必須是void
 
oneway void zip()                               // d
 
}

說明:

a:函數定義可使用逗號或分號標識結束

b:參數能夠是基本類型或者結構體,參數只能是隻讀的(const),不能夠做爲返回值

c:返回值能夠是基本類型或者結構體

d:返回值能夠是void

注意,函數中參數列表的定義方式與struct徹底同樣

Service支持繼承,一個service可以使用extends關鍵字繼承另外一個service。

相關文章
相關標籤/搜索