Thrift

数据类型

1. 基本数据类型

  1. # bool: A boolean value (true or false)
  2. # byte: An 8-bit signed integer
  3. # i16: A 16-bit signed integer
  4. # i32: A 32-bit signed integer
  5. # i64: A 64-bit signed integer
  6. # double: A 64-bit floating point number
  7. # string: A text string encoded using UTF-8 encoding
  8. 通过const定义常量

2. 特殊的数据类型

  1. # binary :主要是JAVA

3. 结构体类型

  1. //基本数据定义结构如下
  2. struct <结构体名称> {
  3. <序号>:[字段性质]<字段类型><字段名称> [=<默认值>] [;|,]
  4. }
  5. //例子
  6. struct Test {
  7. 1:i32 INT32CONTEST = 1,
  8. }
  9. //
  10. struct User {
  11. required string name, //required 声明该字段为必传字段
  12. optional i32 age=0, //optional 声明该字段为非必传字段,所有字段默认为optional
  13. }

struct的一些约束

  • struct 不能继承,但是可以嵌套,但是不能嵌套自己
  • 其成员必须是明确类型的
  • 成员是被正整数编号过的,其编号不能重复,这个是为了在传输过程中编码使用
  • 成员分隔符可以是逗号或者分号,而且可以间隔使用
  • 字段会有optionalrequired的之分,如果不指定则为无类型(可以不填充该值),但是在序列化的时候,也会填充进去,但是optional是不填充则不序列化,required是必须填充也必须序列化
  • 每个字段可以设置默认值
  • 同一个文件可以定义多个struct,也可以在不同的文件,进行include导入

4. 枚举类型

  1. # Thrift 不支持枚举嵌套,枚举常量必须是32位正整数
  2. enum HttpStatus {
  3. OK = 200,
  4. NOTFOUND = 404,
  5. }

5. 异常类型

  1. #定义异常
  2. exception <异常名> {
  3. [序号]:<字段类型> 异常信息
  4. }
  5. # 抛出异常
  6. throws ([序号]:<异常名> 异常字段)

6. service类型

  1. service HelloService {
  2. i32 sayInt(1:i32 param),
  3. string sayString(1:string param),
  4. bool sayBoolean(1:bool param),
  5. void sayVoid()
  6. }
  1. namespace py test
  2. struct User {
  3. 1:i32 id
  4. 2:string name
  5. 3:i32 age=0
  6. }
  7. service UserService {
  8. User getById(1:i32 id),
  9. bool isExist(1:string name)
  10. }

可以通过thrift -r --gen 语言名(py) 文件名来创建一个新的thrift代码

7. namespace类型

  1. namespace py test//类似于module

8. 容器类型

  1. # 1. map 字典
  2. map <t1,t2>
  3. # 2. list 列表
  4. list<t1>
  5. # 3. set 集合
  6. set<t1>

2. Thrift 协议和传输