1、Types
Thrift類型系統包括預定義基本類型,用戶自定義結構體,容器類型,異常和服務定義
(1) 基本類型
bool: 布爾類型,佔一個字節
byte: 有符號字節
i16:16位有符號整型
i32:32位有符號整型
i64:64位有符號整型
double:64位浮點數
string:未知編碼或者二進制的字符串
注意:thrift不支持無符號整形,因爲很多目標語言不存在無符號整形(比如java)
而對於c++而言:
bool: bool
binary: std::string
byte: int8_t
i16: int16_t
i32: int32_t
i64: int64_t
double: double
string: std::string
list<t1>: std::vector<t1>
set<t1>: std::set<t1>
map<t1,t2>: std::map<T1, T2>
其中,binary和string均映射爲std::string,但當數據不爲字符串時,建議使用binary,否則出現傳輸不了“\0”和“0”數據。
(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
2、枚舉類型
可以像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位正整數
3、註釋
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.
1
|
|
4、命名空間
Thrift中的命名空間同C++中的namespace和java中的package類似,它們均提供了一種組織(隔離)代碼的方式。因爲每種語言均有自己的命名空間定義方式(如python中有module),thrift允許開發者針對特定語言定義namespace:
namespace cpp com.example.project // a
namespace java com.example.project // b
5、文件包含
Thrift允許文件包含,需要使用thrift文件名作爲前綴訪問被包含的對象,如:
說明:
a:thrift文件名需要雙引號包含,末尾沒有逗號或者分號
b:注意tweet前綴
6、常量
Thrift允許用戶定義常量,複雜的類型和結構體可以使用JSON形式表示:
const i32 INT_CONST = 1234; // a
const map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}
說明:
a:分號是可選的,支持十六進制賦值
7、定義結構體
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不同,結構體不支持繼承,即,一個結構體不能繼承另一個結構體。
8、定義服務
在流行的序列化/反序列化框架(如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。