从零开始基于go-thrift创建一个RPC服务 (4)

(5) Const
Thrift允许用户定义常量,复杂的类型和结构体可以使用JSON形式表示:

const i32 INT_CONST = 1234 const map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}

示例里,对于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。示例:

struct User { 1:required i32 id = 0; 2:optional string name; }

结构体可以包含其他结构体,但不支持继承结构体。

(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。

struct Pixel{ 1:required i32 Red; 2:required i32 Green; 3:required i32 Blue; } union Pixel_TypeDef { 1:optional Pixel pixel 2:optional i32 value }

联合体要求字段选项都是optional的,因为同一时刻只有一个变量有值。

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

# 这是注释 // 这是注释 /* * 这是注释 */

3、namespace
定义命名空间或者包名。格式示例:

namespace go Sample namespace php Sample

需要支持多个语言,则需要定义多行。命名空间或者包名是多层级,使用.号隔开。例如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? FieldReq? FieldType Identifier ('= ConstValue)? XsdFieldOptions ListSeparator?

其中:

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzdxy.html