Thrift 类型
Thrifth 类型旨在使程序员能够尽可能的使用目标语言的类型,不用的是哪种编程语言。 本文基于 Thrift Whitepaper 编写。 Thrift IDL(翻译进行中) 将介绍每种Thrift类型在对应语言中的类型
基础类型
基础类型以简单,清析的原则选取自所有语言可用的主要类型
类型 | 说明 | 备注 |
---|---|---|
bool | 布尔 | 1位 值为 true 或 false |
i8/byte | 有符号整型 | 8 位(1 字节) |
i16 | 有符号整型 | 16位(2 字节) |
i32 | 有符号整型 | 32位(4 字节) |
i64 | 有符号整型 | 64位(8 字节) |
double | 浮点数 | 64位(8 字节) |
string | 字符串(UTF-8编码) |
说明: 没有无符号整型,是因为大部分编程语言没有无符号整型
特殊类型
binary
一组未编码的字节
说明: 该类型目前为一种特殊的字符串类型,以提高无Java的互用性。目录的规则是将其提升为基本类型
结构体(Structs)
- 用于定义通用对象,本质上等价于面向对象语言里的类, 但没有继续体系。
- 一个结构体,包含若干强类型字段,每个字段都有一个唯一的标识符(identifier), 也可能包含若干附加信息(如:数字ID, 默认值(可选),等), 详见: Thrift IDL (翻译进行中)
容器(Containers)
Thrift 提供多数编程语言常见和常用的容器, 包含以下三种容器:
- list: 一个有序元素列表,对应类型 STL vector, Java ArrayList,脚本语言的数组
- set: 一个无序,无重复元素列表,STL set, Java HashSet, Python set, PHP List(PHP 不支持set)
- map: 键值对(键唯一) STL map, Java HashMap, PHP associative array, Python/Ruby dictionary
容器元素可以是任意有效Thrift类型
说明: 为了提高兼容性,map的键只能是基础类型,有些语言不支持,JSON 协议也只支持基础类型为键
异常 (Exceptions)
基本上和结构体是一样的,唯一的区别就是会继续目标语言的异常基类,以便无缝集成对应语言的异常处理
服务(Services)
服务定义需要用到Thrift类型。定义一个服务,语义上与面向对象语言定义一个接口(或定义一个全是抽象方式的抽象类型), Thrift 编译器会生成实现这个接口的,客户端和服务端
一个服务由若干个方法(有名字,不是匿名方法), 每个方法可以有若干个参数和一个返回类型
说明: void
是一个有效的返回类型,用户定义的其它的Thrift类型也是有效的。 在void
修饰的方法前可以加一个 oneway
限定符(可以这么叫吧?), 由此产生的方法,客户端发送请求后不会等待服务端的响应。 如果没加,那么就算返回类型是void
, 服务端会响应,客户端也会接收响应以确定服务端操作执行完成。而oneway
修饰的方法只在传输层(transport layer) 保证请求是发送成功的 由同一个客户端发送的oneway
方法的多次请求,在服务端处理是并行的(无序的)