Thrift类型系统目的是让编程人员尽可能的使用原生的类型,而不必关心它们所有工作的Thrift白皮书,并且会替代其中的内容。Thrift
IDL提供了用于生成每种目标语言代码的类型说明。
基本类型
被选定的基本类型是为了简单和清晰,而不是丰富和复杂,它主要关注所有编程语言中的关键类型。
1. bool:布尔类型(true或false)
2. byte:8位有符号整数
3. i16:16位有符号整数
4. i32:32位有符号整数
5. i64:64位有符号整数
6. double:64位浮点数
7. string:使用UTF-8编码的文本字符串
注意,上述类型中缺少符号整数类型,这是由于在很多编程语言中没有原生的无符号整数类型。
特殊类型
1. binary:未被编码的字节序列
2. N.B.:这是上述string类型的一种特殊格式,添加这种类型是为提供更好的跟Java的互操作性。当前的计划是在适当时候把它提升到基本类型。
结构体
Thrift结构体定义了一个常用的对象,本质上等价与面向对象编程语言(OOP)中的类,但是它没有继承性。一个结构体是一个强类型字段的集合,每个字段都有一个唯一的命名标识符。字段可以有Thrift IDL中描述的各种注解(如数字字段ID,可选的默认值等)。
容器
Thrift容器是强类型的容器,它对应大多数编程语言中常用的容器类型。
Thrift中有三种容器类型:
list:按顺序排列的元素列表。它会转换成STL中的vector、Java中的ArrayList、脚本语言中的原生数组等;
set:无序的唯一元素的集合。它会转换成STL中的set、Java中的HashSet、Pyhton中的set等。注意:PHP中不支持set,因此它会被看做是一个与List相似的列表。
map:严格的用唯一的键来映射值。它会转换成STL中的map、Java中的HashMap,PHP中的联合数组、Python/Ruby中的dictionary等等。虽然Thrift会提供默认的类型映射,但是这些类型映射不是固定的。被添加的定制的代码生成器指令允许使用目标语言中的定制类型来代替。
容器元素可以是任何有效的Thrift类型。
N.B.:为了最大化的兼容,它的键类型应该映射成基本类型,而不是结构体或容器类型。这是因为有些语言原生的map类型不支持复杂的键类型。另外,JSON协议也只支持基本类型的键。
异常
为了能够任何给定语言的原生异常进行无缝的集成,除了它们会继承目标编程语言中基本的异常类之外,Thrift的异常基本上等同于结构。
服务
服务的定义要使用Thrift类型。它在语义上等同于面向对象编程语言中的接口(或纯虚拟抽象类)定义。Thrift编译器会生成具有完整功能的客户端和需要实现的服务端接口存根。
一个服务是由一组命名函数组成,包含函数名、参数列表、返回值。
注意,所有的被定义的Thrift类型都可以作为函数的返回类型,包括void。另外,可以给返回值是void的函数添加async修饰符,这样就会生成不等待响应的代码。注意,纯粹的void函数会把响应返回给客户端,这样来保证服务端的代码被执行完成。客户端调用带有async关键字的方法,只保证了该请求被成功的传输到了服务端。相同客户端的异步方法可以被服务端并行执行。