小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
简介
Thrift 通过 IDL(Interface Definition Language)定义通用的服务接口,通过 Thrift 提供的编译器,将 IDL 编译为不同语言的代码,通过这个方式实现跨语言的功能。
我写的这篇文章,参考了两篇比较好的文章,从实践的角度看下 Thrift IDL 的编写
文章系列
struct 结构体
struct 是 Thrift 的基本组成类型,他的特点是:
- 成员都通过整数编号,且编号不能重复;
- 成员可以通过 required、optional 描述符描述,如果 required 的成员没有赋值,会得到提示,如果 optional 的成员没有赋值,则不会被序列化。描述符也可以为空,默认情况既不是optional,也不是required,而是"opt-in, req-out",参考官网解释
- 成员都需要有明确类型
struct PackageInfo {
1: optional i32 id;
2: optional string url;
3: optional string name;
}
复制代码
文件引用
开发过程中,我们一般不会把 struct 都放到一个文件中,会拆分为多个文件定义,通过 include 关键字互相引用
// base.thrift
struct BaseInfo {
1: optional i32 id;
2: optional string url;
3: optional string name;
}
复制代码
// package.thrift
include "./base.thrift" // 需要是双引号
struct PackageInfo {
1 : optional string base.name; // 通过文件名找到 base,注意不是命名空间
2 : optional string description;
}
复制代码
基本类型
- bool: 布尔值,对应Java中的boolean,
- byte: 有符号字节,对应Java中的byte,对应MySQL的tinyint
- i16: 16位有符号整型,对应Java中的short,对应MySQL的smallint
- i32: 32位有符号整型,对应Java中的int,对应MySQL的int
- i64: 64位有符号整型,对应Java中的long,对应MySQL的bigint
- double: 64位浮点型,对应Java中的double
- string: 字符串,对应Java中的String
- binary: Blob 类型,对应Java中的byte[]
这里都是有符号的,出于不同语言的兼容性考虑,IDL 不支持无符号的类型
MySQL 参考:dev.mysql.com/doc/refman/…
struct ExampleInfo {
1: optional i32 id;
2: optional string url;
3: optional string name;
}
复制代码