Thrift采用IDL(Interface Description Language/接口描述语言)来定义Thrift类型,然后由Thrift代码生成器生成开发人员所需要的目标语言代码文件。Thrift数据类型包含以下基本数据类型、结构体、容器、枚举等。
基本数据类型
基本数据类型简单明了,包含了所有编程语言中的可用基本数据类型。
- bool:布尔值(true/false)
- byte:8位有符号整型
- i16:16位有符号整型
- i32:32位有符号整型
- i64:64位有符号整型
- double:64位浮点数
string:由utf8编码的文本字符串
注:没有无符号整型,因为有些编程语言不支持typedef bool boolType typedef i8 i8Type typedef i16 i16Type typedef byte byteType typedef i32 i32Type typedef i64 i64Type typedef string strType
特殊类型
- binary:未编码的字节流
字符串类型的特殊形式,设计目的是为了与Java更好的交互 (未来会提升为基本数据类型)
typedef binary binaryType
结构体(struct)
Thrift struct定义了一个公共的对象,基本等同于OOP语言中的类,但不能继承。struct有一组强类型字段,每个字段都有唯一的名称标识符。每个字段都可以具有IDL语言中描述的各种注释(数字字段ID,可选的默认值等)
struct StructType {
1: required string msg; // 该字段必须填写
2: optional i32 type = 0; // 赋予该字段默认值
3: i32 time // 默认是optional
}
容器(container)
Thrift容器是强类型容器,可映射到大多数编程语言中常用的容器类型。
- list:元素的有序列表,对应转换到STL的vector,Java的ArrayList,脚本语言中的数组等
- set:无序的元素集合,对应转换到STL的set,Java的HashSet,Python的set等。注:php中不支持集合,所以于php而言它等同于list
- map:对应转到到STL的map,Java的HashMap,PHP的关联数组,Python/Ruby的字典等。虽然提供了默认值,但未明确修复类型映射。Thrift添加了自定义代码生成器指令,允许使用目标语言来替换自定义类型
容器元素可以是任何有效的thrift类型。
为了获得最大的兼容性,map的键类型最好是基本数据类型,而不是struct或者container。因为有些编程语言的原生map类型中不支持更复杂的键类型。此外,json协议只支持key的类型是基本数据类型
typedef list<string> listType
typedef set<string> setType
typedef map<string, string> mapType
枚举
枚举创建一个带有命名值的枚举类型,枚举类型第一个元素默认为0,也可以为其赋值,但后一个元素必须比前面的元素大。赋予的任何常量值必须为非负数。
enum enumType{
code_ok= 0,
code_err= 1
}
常量定义和类型定义
const i32 intConst = 1234
const enumType slefEnumType = enumType.code_ok
异常
除了它们在每种目标语言中适当的继承原生异常基类之外,异常在功能上类似于结构体。以便与任何目标语言中的本机异常处理无缝集成。
exception exceptionType{
1: i32 errCode;
2: string msg;
3: string info
}
服务
使用Thrift类型来定义服务。服务的定义在语义上等同于OOP编程中定义的接口(或纯抽象类)。Thrift编译器会生成实现这些接口的client和server stub。
- 服务由一组命名函数组成,每组函数都有一个参数列表和一个返回类型。
- 除了其他所有已定义的已定义的Thrift类型之外,void是函数返回的有效类型
- 可以将单向修饰符关键字添加到void函数,该函数是生成不等待响应的代码
- 纯void函数将返回对客户端的响应,以确保操作已在服务端完成
- 使用单向方法调用客户端仅保证请求在传输层完成
- 可以由服务器并行/不按调用顺序的方式执行同一客户端的单向方法调用
service Hello{
string helloString(1:string para);
i32 helloInt(1:i32 para);
bool helloBoolean(1:bool para);
void helloVoid();
string helloNull();
}
命名空间
Thrift的命名空间类似于C++中的namespace和java中的package,提供了一种隔离代码文件的方式,避免命名冲突等。
namespace java xxx
namespace cpp xxx
namespace php xxx
注释
Thrift支持Java中的多行注释
/**
* 这里是常量定义
**/
include
为了提高代码可用性,是代码可复用,经常将不同类别的代码写在不同的文件中,将代码隔离开。include使得来自另一个文件的所有符号都可见(带前缀使用),并将相应的include语句添加到此Thrift文档生成的代码中。
include "Hello.thrift"
const i32 demoConst = Hello.intConst
Thrift系列博客:
Thrift(一)——基本使用与概念
Thrift(二)——数据类型
Thrift(三)——传输层、协议、处理器、服务端
Thrift(四)——几种服务端类型