Thrift接⼝描述语⾔(IDL)语法说明
1. 本⽂档⼤部分内容翻译⾃⽂章:。
1.1 主要特性:
IDL 名字空间 / 语⾔名字空间 /
基本类型 / 常量&枚举 / 容器 /
结构体 / 结构体的演化(升级) /
服务 / 服务继承 /
异步调⽤ / ⾃定义异常 /
1.2 不⽀持的特性
不⽀持多态 / 重载.
没有异构容器: 容器中元素的类型必须⼀样.
不能返回 null.
2. 语法参考
2.1 Types
Thrift类型系统包括预定义基本类型,⽤户⾃定义结构体,容器类型,异常和服务定义
(1) 基本类型
1 2 3 4 5 6 7 8 9 10 11 12 13bool :布尔类型( true or value),占⼀个字节byte:有符号字节
double :64位浮点数
string:未知编码或者⼆进制的字符串
注意,thrift不⽀持⽆符号整型,因为很多⽬标语⾔不存在⽆符号整型(如java)。
(2) 容器类型
Thrift容器与类型密切相关,它与当前流⾏编程语⾔提供的容器类型相对应,采⽤java泛型风格表⽰的。Thrift提供了3种容器类型:List<t1>:⼀系列t1类型的元素组成的有序表,元素可以重复
Set<t1>:⼀系列t1类型的元素组成的⽆序表,元素唯⼀
Map<t1,t2>:key/value对(key的类型是t1且key唯⼀,value类型是t2)。
容器中的元素类型可以是除了service意外的任何合法thrift类型(包括结构体和异常)。
(3) 结构体和异常
Thrift结构体在概念上同C语⾔结构体类型—-⼀种将相关属性聚集(封装)在⼀起的⽅式。在⾯向对象语⾔中,thrift结构体被转换成类。
异常在语法和功能上类似于结构体,只不过异常使⽤关键字exception⽽不是struct关键字声明。但它在语义上不同于结构体—当定义⼀个RPC服务时,开发者可能需要声明⼀个远程⽅法抛出⼀个异常。
结构体和异常的声明将在下⼀节介绍。
(4) 服务
服务的定义⽅法在语法上等同于⾯向对象语⾔中定义接⼝。Thrift编译器会产⽣实现这些接⼝的client和server桩。具体参见下⼀节。(5) 类型定义
Thrift⽀持C/C++风格的typedef:
1 2 3typedef i32 MyInteger \\a typedef Tweet ReTweet \\b
说明:
a. 末尾没有逗号
b. struct可以使⽤typedef
2.2 枚举类型
可以像C/C++那样定义枚举类型,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24enum 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
25 26 2716: optional string language = "english" }
说明:
a. 编译器默认从0开始赋值
b. 可以赋予某个常量某个整数
c. 允许常量是⼗六进制整数
d. 末尾没有逗号
e. 给常量赋缺省值时,使⽤常量的全称
注意,不同于protocol buffer,thrift不⽀持枚举类嵌套,枚举常量必须是32位的正整数2.3 注释
Thrfit⽀持shell注释风格,C/C++语⾔中单⾏或者多⾏注释风格
1 2 3 4 5 6 7 8 9 10 11# 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.
2.4 命名空间
Thrift中的命名空间同C++中的namespace和java中的package类似,它们均提供了⼀种组织(隔离)代码的⽅式。因为每种语⾔均有⾃⼰的命名空间定义⽅式(如python中有module),thrift允许开发者针对特定语⾔定义namespace:
1 2 3namespace ample.project // a namespace ample.project // b
说明:
a.转化成namespace com { namespace example { namespace project {
b.转换成ample.project
2.5 ⽂件包含
Thrift允许thrift⽂件包含,⽤户需要使⽤thrift⽂件名作为前缀访问被包含的对象,如:
1 2 3 4 5 6 7 8 9include "tweet.thrift" // a ...
struct TweetSearchResult { 1: list<tweet.Tweet> tweets; // b }
说明:
a. thrift⽂件名要⽤双引号包含,末尾没有逗号或者分号
b.注意tweet前缀
2.6 常量
Thrift允许⽤户定义常量,复杂的类型和结构体可使⽤JSON形式表⽰。
1 2 3const i32 INT_CONST = 1234; // a
const map<string,string> MAP_CONST = { "hello" : "world" , "goodnight" : "moon" }
说明:
a.分号是可选的,可有可⽆;⽀持⼗六进制赋值。
2.7 定义结构体
结构体由⼀系列域组成,每个域有唯⼀整数标识符,类型,名字和可选的缺省参数组成。如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21struct 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
write的返回值1: required double latitude;
2: required double longitude;
}
说明:
a. 每个域有⼀个唯⼀的,正整数标识符
b. 每个域可以标识为required或者optional(也可以不注明, 默认 optional)
c. 结构体可以包含其他结构体
d. 域可以有缺省值
e. ⼀个thrift中可定义多个结构体,并存在引⽤关系
规范的struct定义中的每个域均会使⽤required或者optional关键字进⾏标识。如果required标识的域没有赋值,thrift将提⽰错误。如果optional标识的域没有赋值,该域将不会被序列化传输。如果某个optional标识域有缺省值⽽⽤户没有重新赋值,则该域的值⼀直为缺省值。
与service不同,结构体不⽀持继承,即,⼀个结构体不能继承另⼀个结构体。
2.8 定义服务
在流⾏的序列化/反序列化框架(如protocol buffer)中,thrift是少有的提供多语⾔间RPC服务的框架。
Thrift编译器会根据选择的⽬标语⾔为server产⽣服务接⼝代码,为client产⽣桩代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20//“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
3. 产⽣代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论