目前,业内流行的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
通过编程语言名,可以为特定的编程语言生成特定的命名空间,也可以通过*
所有目标语言使用命名空间。
数据类型
基础类型
-
bool:布尔值(boolean) -
byte:8比特有符号整型(byte,Byte) -
i16:16比特有符号整型(short,Short) -
i32:32比特有符号整型(int,Integer) -
i64:64比特有符号整型(long,Long) -
double:64位浮点数(double,Double) -
string:UTF-8编码字符串(String)
容器类型
-
list:ArrayList , -
set:HashSet -
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
参考
-
https://thrift-tutorial.readthedocs.io/en/latest/
-
https://blog.csdn.net/weixin_38369492/article/details/106210208
发表评论