Thrift的基本语法
半野

1.头部

1.1.引用

使用include添加对其他thrift文件的引用,例如:

1
`include "common.thrfit" `

注意,在使用的时候,要加文件名作为前缀,不是包名,例如:

1
`// person.thrfit namespace java com.xyz.abc struct Person{ 1: string name; 2: i32 age } // service.thrift include "person.thrfit" namespace java abc.xzy.def service PersonRepository{ + person.Person get(1: int id) } `

1.2.命名空间

即为Java中包名(package)的概念,使用namespace关键字,例如:

1
`namespace java com.xyz.abc namespace cpp Xyz.Abc namespace py xyz.abc `

通过编程语言名,可以为特定的编程语言生成特定的命名空间,也可以通过*所有目标语言使用命名空间。

2.数据类型

2.1.基础类型

  1. bool:布尔值(boolean)
  2. byte:8比特有符号整型(byte,Byte)
  3. i16:16比特有符号整型(short,Short)
  4. i32:32比特有符号整型(int,Integer)
  5. i64:64比特有符号整型(long,Long)
  6. double:64位浮点数(double,Double)
  7. string:UTF-8编码字符串(String)

2.2.容器类型

  1. list:ArrayList ,
  2. set:HashSet
  3. map:HashMap<FieldType, FieldType>

2.3.自定义类型 struct

Struct:类或者C语言中的结构,例如:

1
`struct Work { 1: i32 num1 = 0, 2: i32 num2, 3: Operation op, 4: optional string comment, } `

structs的注意事项:

-
结构体不支持继承,一个结构体不能继承另一个结构体。

-
如果required标识的字段没有赋值,thrift将给予提示。

-
如果optional标识的字段没有赋值,该字段将不会被序列化传输。如果某个optional标识字段有缺省值而用户没有重新赋值,则该字段的值一直为缺省值。

2.4.异常

exception

1
`exception InvalidOperation { 1: i32 what, 2: string why } `

2.5.服务

services:服务由一组命名函数组成,每个函数都有一个参数列表和一个返回类型。它在语义上等同于定义接口或纯虚抽象类。对应于Java中的接口。

1
`service StringCache { void set(1:i32 key, 2:string value), string get(1:i32 key) throws (1:KeyNotFound knf), oneway void delete(1:i32 key) } `

注意:

  • ”oneway”标识符表示client发出请求后不必等待回复(非阻塞)直接进行下面的操作
  • ”oneway”方法的返回值必须是void
  • 参数可以是基本类型或者结构体,参数只能是只读的(const),不可以作为返回值

2.6.特殊类型

binary: 未编码的字节序列

2.7.其他标识符

2.7.1.枚举

enum:枚举创建一个枚举类型,具有命名值。如果未提供常量值,则第一个元素的值要么是 0,要么是任何后续元素的前一个值。提供的任何常量值都必须为非负值。

1
`enum Operation { ADD = 1, SUBTRACT = 2, MULTIPLY = 3, DIVIDE = 4 } `

2.7.2.typedef:类型更名,别名

1
`typedef i32 MyInteger `

2.7.3.const :常量

1
`const i32 INT32CONSTANT = 9853 `

3.注释

Thrift支持shell注释风格、C/C++语言中的单行或多行注释风格

4.代码生成

4.1.语法

1
`thrift [options] file `

例如,生成Java代码:

1
`thrift -r --gen java fileName.thrift `

将会在当前目录下生成gen-java文件夹,该目录将包含 Thrift 在 java 中生成的所有代码。选项 -r 是指定我要为我们的 .thrift 文件中的潜在包含生成递归代码。

4.2.实例:

1
`// thrift/person.thrift namespace java com.zxc.thriftTest struct Person{ 1: string name; 2: i32 age } // thrift/test.thrift include "person.thrift" namespace java com.zxc.thriftTest typedef i32 int; exception customException{ 1: string msg } service PersonRepository{ person.Person get(1: int id) throws (1:customException e); list listPersons(); void deletePerson(1:int id) } `

4.2.1.include文件递归生成——“-r参数”

thrift -r --gen java test.thrift生成的目录树:

1
`xxxx\thrift │ person.thrift │ test.thrift │ └─gen-java └─com └─zxc └─thriftTest customException.java Person.java PersonRepository.java `

thrift --gen java test.thrift生成的目录树:

1
`xxxx\thrift │ person.thrift │ test.thrift │ └─gen-java └─com └─zxc └─thriftTest customException.java PersonRepository.java `

不加参数**-r**,不生成include文件的代码。

4.2.2.指定输出目录——“-out dir”

-out dir参数将会更改默认的输出文件夹路径,将原来默认输出到gen-java文件夹中的内容输出到指定的dir中。

thrift -r --gen java -out ../java test.thrift

1
`xxxx\ ├─java │ │ Main.java │ │ │ └─com │ └─zxc │ └─thriftTest │ customException.java │ Person.java │ PersonRepository.java │ └─thrift person.thrift test.thrift `

5.参考

  1. Thrift Tutorial
  2. Thrift简介及语法
由 Hexo 驱动 & 主题 Keep
总字数 105.7k 访客数 访问量