Thrift 简明教程
Thrift 简明教程
语法教程
Thrift 采用IDL(Interface Definition Language)来定义通用的服务接口,然后通过Thrift提供的编译器,可以将服务接口编译成不同语言编写的代码,通过这个方式来实现跨语言的功能。
文档结构
每个Thrift文档包含0或更多个Header定义, 然后,后面跟着0或多个类型定义。
Header定义
每个头部是Thrift Include、C++ Include 或者 Namespace。
Thrift Include
include指令使得来自另一个thrift文件的所有符号都可见(带有前缀),并将相应的include语句添加到为此Thrift文档生成的代码中。
C++ Include
C ++包含为此Thrift文档的C++代码生成器的输出添加自定义C++包含。
Namespace
命名空间声明了哪些命名空间/包/模块/等。将为目标语言声明此文件中的类型定义。
命名空间范围指示命名空间适用的语言;
命名空间范围包括: ‘cpp’ | ‘java’ | ‘py’ | ‘perl’ | ‘rb’ | ‘cocoa’ | ‘csharp’
范围“*”表示命名空间适用于所有目标语言。
include 指令
用 include 指令包含其他 thrift 文件:
1 | include "another.thrift" |
namespace 指令
namespace 指令指定语言相关的名称空间:
1 | namespace cpp nscpp # 指定C++的名称空间为 nscpp |
类型定义
类型定义包括:
1 | Const | Typedef | Enum | Senum | Struct | Union | Exception | Service |
常量
常量用const表示:
1 | const i32 MATHPATH = 256 |
typedef 指令
typedef 指令用来指定类型别名,和 C语言一样。
1 | typedef i32 MyInteger |
枚举
用 enum 定义枚举。枚举类型是32位的整数。值是可选的,从1开始。
1 | enum Operation { |
Senum(Slist)
过时,不使用了,由string替代。
Struct 结构体
结构体用 struct 表示,是基本的复合数据类型,由若干字段组成。每个字段由整型ID,类型,名称和可选的默认值组成。字段可以声明为 optional,表示如果没有被设置,则不进行序列化。
1 | struct Work { |
Union 联合体
Union 和 struct 类似,除了它提供了一种方法来传输一组可能的字段中的一个字段。就像C ++中的union {}一样。因此,Union 成员被隐含地视为optional可选的)。
Exception 异常
异常类似于结构,除了它们旨在与目标语言中的异常处理机制集成。
在异常中,每个字段的名称必须是唯一的。
1 | exception InvalidOperation { |
Service 服务
服务用 service 关键字定义。服务可以用 extends 关键字继承其他服务。service 由一系列方法组成。方法由返回值,参数列表和一个可选的异常列表组成。参数列表和异常列表的语法和结构体的语法一样。
1 | service Calculator extends shared.SharedService { |
oneway 方法必须返回void, 不能抛出异常。
方法与类型
方法由 可选的”oneway”标识 + 方法返回值类型 + 标识名 + 参数列表 + 异常列表组成。
方法类型包括 void 或 数值类型。
异常抛出:由 throws关键字 + 异常列表 组成。
常量类型
整形常量、Double常量、列表常量[]、 map常量 {}。
基本类型
类型 | 描述 |
---|---|
bool |
布尔类型,1byte |
i8 |
有符号整形,8bits,即byte |
i16 |
有符号整型,16bits |
i32 |
有符号整型,32bits |
i64 |
有符号整型,64bits |
double |
浮点型,64bits |
string |
字符串 |
binary |
Blob,byte数组 |
map<t1,t2> |
map |
list<t1> |
有序列表 |
set<t1> |
无重复元素的容器 |
容器类型
集合中的元素可以是除了service之外的任何类型,包括exception。
- list
: 一系列由T类型的数据组成的有序列表,元素可以重复 - set
: 一系列由T类型的数据组成的无序集合,元素不可重复 - map<K, V>: 一个字典结构,key为K类型,value为V类型,相当于Java中的HMap<K,V>
可选与必选
thrift提供两个关键字required,optional,分别用于表示对应的字段时必填的还是可选的。例如:
1 | struct People { |
注释
1 | # 脚本注释 |
编译Thrift
1 | thrift-r --gen cpp ICalc.thrift |