Thrift IDL基本語法
本文主要介紹Thrift的IDL基本語法。
IDL
Thrift 采用IDL(Interface Definition Language)來定義通用的服務接口,然后通過Thrift提供的編譯器,可以將服務接口編譯成不同語言編寫的代碼,通過這個方式來實現跨語言的功能。
基本類型
thrift
基本支持所有的Java基本類型以及引用類型。
- bool
- 布爾值,對應java中的boolean
- byte
- 有符號字節,對應java中的byte
- i16
- 16位有符號整型,對應java中的short
- i32
- 32位有符號整型,對應java中的int
- i64
- 64位有符號整型,對應java中的long
- double
- 64位浮點型,對應java中的double
- string
- 字符串,對應java中的String
- binary
- 對應java中的byte[]
struct結構體
struct有以下的一些約束:
- struct不能繼承,但是可以嵌套,不能嵌套自己。
- 其成員都是有明確的類型
- 成員都是被正整數編號過的,其中的編號不能重復,為了在傳輸過程中編碼使用。
- 成員分隔符可以是逗號(,)或者分號(;),而且可以混用。
- 字段會有有optional和required之分。但是如果不指定則為無類型–可以不填充該值,但是在序列化傳輸的時候也會序列化進去,optional是不填充則不序列化,required是必須填充也必須序列化。
- 每個字段可以設置默認值。
- 同一個文件可以定義多個struct,也可以定義在不同的文件,進行include引入。
例子:
-
struct User { 1: required string name, // 該字段值必須填寫 2: optional i32 age = 0; // 默認值 3: bool gender // 默認為optional }
如果required標識的域沒有賦值,Thrift將給予提示;
如果optional標識的域沒有賦值,該域將不會被序列化傳輸;
如果某個optional標識域有缺省值而用戶沒有重新賦值,則該域的值一直為缺省值;
如果某個optional標識域有缺省值或者用戶已經重新賦值,而不設置它的__isset為true,也不會被序列化傳輸。
container容器
有三種可用的容器類型:
- list<t>
- 元素類型為t的有序列表,允許重復。類似于java中的ArrayList。
- set<t>
- 元素類型為t的無序表,不允許重復。類似于java中的HashSet。
- map<t, t>
- 鍵類型為t,值類型為t的鍵值對,鍵不允許重復。類似于java中的HashMap。
例子:
struct Test {
1: map<string, User> usermap,
2: set<i32> intset,
3: list<double> doublelist
}
enum枚舉
enum類型有如下約束:
- 編譯器默認從0開始賦值。
- 可以賦予某個常量為某個整數。
- 允許常量是16進制整數。
- 末尾沒有分號。
- 給常量賦缺省值的時候,使用常量全程。
Thrift不支持枚舉類嵌套,枚舉常量必須是32位正整數。
例子:
enum HTTPStatus {
OK = 200,
NOT_FOUND = 404
}
const常量
在變量前加const。
例子:
const i32 age = 28;
typedef類型定義
Thrift支持類似C/C++的類型定義。
例子:
typedef i32 myInt
typedef i64 myNumber
類型定義的末尾沒有逗號。
exception異常
異常在語法和功能上類似于結構體,差別是異常使用關鍵字exception,而且異常是繼承每種語言的基礎異常類。
例子:
exception MyException {
1: i32 errCode,
2: string errMsg
}
service服務
服務的定義方法在語義上等同于面向對象語言中的接口。
例子:
service HelloService {
i32 sayInt(1:i32 param)
string sayString(1:string param)
bool sayBoolean(1:bool param)
void sayVoid()
}
namespace命名空間
Thrift中的命名空間類似于C++中的namespace和java中的package,它們提供了一種組織(隔離)代碼的簡便方式。
名字空間也可以用于解決類型定義中的名字沖突。
例子:
namespace java com.example.test
namespace py example
namespace go example
include引用
為了便于管理、重用和提高模塊性/組織性,我們常常分割Thrift定義在不同的文件中。
Thrift允許文件包含其它thrift文件,用戶需要使用thrift文件名作為前綴訪問被包含的對象。
Thrift文件名要用雙引號包含,末尾沒有逗號或者分號。
例子:
include "test.thrift"
include "../test.thrift"
注釋
支持多行和單行風格。
例子:
/**
* This is a multi-line comment.
* Just like in C.
*/
// C++/Java style single-line comments work just as well.
參考資料