(5) Const
Thrift允许用户定义常量,复杂的类型和结构体可以使用JSON形式表示:
示例里,对于PHP来说,会生成Constant类;对于golang来说,会生成名称一样的常量。
(6) Exception
用于定义异常。示例:
exception BizException { 1:required i32 code 2:required string msg }示例里,对于PHP来说,会生成BizException类,继承自TException;对于golang来说,会生成BizException结构体及相关方法。
(7) Struct
结构体struct在PHP里相当于class,golang里还是struct。示例:
结构体可以包含其他结构体,但不支持继承结构体。
(8) Service
Thrift编译器会根据选择的目标语言为server产生服务接口代码,为client产生桩(stub)代码。
service在PHP里相当于interface,golang里是interface。service里定义的方法必须由服务端实现。
示例:
service Greeter { Response SayHello( 1:required User.User user ) Response GetUser( 1:required i32 uid ) } //继承 service ChildGreeter extends Greeter{ }注意:
参数可以是基本类型或者结构体,参数只能是只读的(const),不可以作为返回值
返回值可以是基本类型或者结构体,返回值可以是void
支持继承,一个service可使用extends关键字继承另一个service
(9) Union
定义联合体。查看联合体介绍 https://baijiahao.baidu.com/s?id=1623457037181175751&wfr=spider&for=pc。
联合体要求字段选项都是optional的,因为同一时刻只有一个变量有值。
2、注释
支持shell注释风格、C/C++语言中的单行或多行注释风格。
3、namespace
定义命名空间或者包名。格式示例:
需要支持多个语言,则需要定义多行。命名空间或者包名是多层级,使用.号隔开。例如Sample.Model最终生成的代码里面PHP的命名空间是\Sample\Model,golang则会生成目录Sample/Model,包名是Model。
4、文件包含
thrift支持引入另一个thrift文件:
include "User.thrift" include "TestDefine.thrift"注意:
(1) include 引入的文件使用的使用,字段必须带文件名前缀:
1:required User.User user不能直接写User user,这样会提示找不到User定义。
(2)假设编译的时候A里引入了B,那么编译A的时候,B里面定义的也会被编译。
5、Field
字段定义格式:
其中:
FieldID必须是IntConstant类型,即整型常量。
FieldReq (Field Requiredness,字段选项)支持required、optional两种。一旦一个参数设置为 required,未来就一定不能删除或者改为 optional,否则就会出现版本不兼容问题,老客户端访问新服务会出现参数错误。不确定的情况可以都使用 optional 。
FieldType 就是字段类型。
Identifier 就是变量标识符,不能为数字开头。
字段定义可以设置默认值,支持Const等。
示例:
struct User { 1:required i32 id = 0; 2:optional string name; } IDE插件1、JetBrains PhpStorm 可以在插件里找到Thrift Support安装,重启IDE后就支持Thrift格式语法了。
2、VScode 在扩展里搜索 Thrift,安装即可。
参考1、Apache Thrift - Index of tutorial/
2、Apache Thrift - Interface Description Language (IDL)
3、Thrift语法参考 - 流水殇 - 博客园
https://www.cnblogs.com/yuananyun/p/5186430.html
4、和 Thrift 的一场美丽邂逅 - cyfonly - 博客园
https://www.cnblogs.com/cyfonly/p/6059374.html