thrift 语法

ads

目前,业内流行的RPC框架有Thrift的gRPC等,这两个支持相当多的语言,这里简单记录下Thrift文件的写法。

头部

引用

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

include "common.thrfit"

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

+ // 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)
}

命名空间

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

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

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

数据类型

基础类型

  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)

容器类型

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

自定义类型 struct

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

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

==structs==的注意事项:

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

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

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

异常

exception

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

服务

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

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),不可以作为返回值

特殊类型

binary: 未编码的字节序列

其他标识符

枚举

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

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

typedef:类型更名,别名

typedef i32 MyInteger

const :常量

const i32 INT32CONSTANT = 9853

注释

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

代码生成

语法

thrift [options] file

例如,生成Java代码:

thrift -r --gen java fileName.thrift

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

实例:

// thrift/person.thriftnamespace java com.zxc.thriftTeststruct Person{    1: string name;    2: i32 age}// thrift/test.thriftinclude "person.thrift"namespace java com.zxc.thriftTesttypedef i32 int;exception customException{    1: string msg}service PersonRepository{    person.Person get(1: int id) throws (1:customException e);    list<person.Person> listPersons();    void deletePerson(1:int id)}

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

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

xxxxthrift│  person.thrift│  test.thrift│└─gen-java    └─com        └─zxc            └─thriftTest                    customException.java                    Person.java                    PersonRepository.java

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

xxxxthrift│  person.thrift│  test.thrift│└─gen-java    └─com        └─zxc            └─thriftTest                    customException.java                    PersonRepository.java

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

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

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

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

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

参考

  1. https://thrift-tutorial.readthedocs.io/en/latest/

  2. https://blog.csdn.net/weixin_38369492/article/details/106210208

最后编辑于:2024/1/16 拔丝英语网

admin-avatar

英语作文代写、国外视频下载

高质量学习资料分享

admin@buzzrecipe.com