【傳輸協議】thrift的IDL語法

1、IDL

Thrift 採用IDL(Interface Definition Language)來定義通用的服務接口,而後經過Thrift提供的編譯器,能夠將服務接口編譯成不一樣語言編寫的代碼,經過這個方式來實現跨語言的功能。php

 

2、基本類型

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: Blob 類型 對應Java中的byte[]
View Code

3、struct 結構體

  • struct不能繼承,可是能夠嵌套,不能嵌套本身。
  • 其成員都是有明確類型
  • 成員是被正整數編號過的,其中的編號使不能重複的,這個是爲了在傳輸過程當中編碼使用。
  • 成員分割符能夠是逗號(,)或是分號(;),並且能夠混用
  • 字段會有optional和required之分和protobuf同樣,可是若是不指定則爲無類型–能夠不填充該值,可是在序列化傳輸的時候也會序列化進去,optional是不填充則部序列化,required是必須填充也必須序列化。
  • 每一個字段能夠設置默認值
  • 同一文件能夠定義多個struct,也能夠定義在不一樣的文件,進行include引入。

案例java

struct User{
  1: required string name, //改字段必須填寫
  2: optional i32 age = 0; //默認值
  3: bool gender //默認字段類型爲optional
}
View Code
  • 若是required標識的域沒有賦值,Thrift將給予提示;
  • 若是optional標識的域沒有賦值,該域將不會被序列化傳輸;
  • 若是某個optional標識域有缺省值而用戶沒有從新賦值,則該域的值一直爲缺省值;
  • 若是某個optional標識域有缺省值或者用戶已經從新賦值,而不設置它的__isset爲true,也不會被序列化傳輸。

4、Container (容器)

有3種可用容器類型:python

  • list<t>: 元素類型爲t的有序表,允許元素重複。對應c++的vector,java的ArrayList或者其餘語言的數組
  • set<t>: 元素類型爲t的無序表,不允許元素重複。對應c++中的set,java中的HashSet,python中的set,php中沒有set,則轉換爲list類型了
  • map<t, t>: 鍵類型爲t,值類型爲t的kv對,鍵不允許重複。對用c++中的map, Java的HashMap, PHP 對應 array, Python/Ruby 的dictionary

例子:c++

struct Test {
  1: map<string, User> usermap,
  2: set<i32> intset,
  3: list<double> doublelist
}
View Code

 

5、enum (枚舉)

  • 編譯器默認從0開始賦值
  • 能夠賦予某個常量某個整數
  • 容許常量是十六進制整數
  • 末尾沒有分號
  • 給常量賦缺省值時,使用常量的全稱
  • Thrift不支持枚舉類嵌套,枚舉常量必須是32位的正整數

例子數組

enum HttpStatus {
  OK = 200,
  NOTFOUND=404
}
View Code

6、常量定義

使用方法:在變量前面加上constide

例子:ui

const i32 const_int = 1;
View Code

 

7、類型定義

Thrift支持C/C++類型定義編碼

例子:spa

typedef i32 myint
typedef i64 usernumber
View Code

規則:3d

末尾沒有逗號

8、Exception (異常)

異常在語法和功能上相似於結構體,差異是異常使用關鍵字exception,並且異常是繼承每種語言的基礎異常類。

例子:

exception MyException {
    1: i32 errorCode,
    2: string message
}
View Code

 

9、Service (服務定義類型)

服務的定義方法在語義上等同於面嚮對象語言中的接口。

service HelloService {
    i32 sayInt(1:i32 param)
    string sayString(1:string param)
    bool sayBoolean(1:bool param)
    void sayVoid()
}
View Code

10、Namespace (名字空間)

Thrift中的命名空間相似於C++中的namespace和java中的package,它們提供了一種組織(隔離)代碼的簡便方式。名字空間也能夠用於解決類型定義中的名字衝突。
因爲每種語言均有本身的命名空間定義方式(如python中有module), thrift容許開發者針對特定語言定義namespace:

例子:

namespace java com.example.test
View Code

轉化爲:

package com.example.test
View Code

 

11、Comment (註釋)

Thrift支持C多行風格和Java/C++單行風格。
例子:

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

 

12、Include

便於管理、重用和提升模塊性/組織性,咱們經常分割Thrift定義在不一樣的文件中。包含文件搜索方式與c++同樣。Thrift容許文件包含其它thrift文件,用戶須要使用thrift文件名做爲前綴訪問被包含的對象。

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

include "test.thrift"
...
struct StSearchResult {
1: in32 uid;
...
}
View Code
相關文章
相關標籤/搜索