idl-thrift语法| 青训营笔记

156 阅读3分钟

idl-thrift语法| 青训营笔记

这是我参与「第六届青训营 」笔记创作活动的第2天

IDL

thrift是一个典型的CS(客户端/服务端)结构,客户端和服务端可以使用不同的语言开发。既然客户端和服务端能使用不同的语言开发,那么一定就要有一种中间语言来关联客户端和服务端的语言,这种语言就是IDL(InterfaceDescription Language),thrift采用IDL来定义通用的服务接口,然后通过thrift提供的编译器,可以将服务接口编译成不 同语言编写的代码,通过这个方式来实现跨语言的功能。

thrift语法

基本类型

TypeDescGOJAVA
i8有符号8位整数int8byte
i16有符号16位整数int16float
i32有符号32位整数int32int
i64有符号64位整数int64long
double64位浮点数float64double
bool布尔值boolboolean
stringUTF-8编码的字符串stringjava.lang.String
binary未编码的字节序列[]bytejava.nio.ByteBuffer

容器类型

TypeDescGOJAVA
list可重复的有序列表[]Tjava.util.List
set不重复的无序列表[]T(Go中没有set)java.util.Set
map<K,V>k-v存储,k不能重复mapVjava.util.Map

常量及类型别名

常量关键字:const,别名关键字:typedef

c
复制代码
//常量定义
const i32 MALE_INT = 1
const map<i32,string>GENDER_MAP = {1:"male",2:"female"}
//某些数据类型比较长可以用别名简化
typedef map<i32,string> gmp

struct类型

struct对应其他语言的或者结构体,定义格式如下:

xml
复制代码
struct <结构体名称> {
    <序号>:[字段性质]<字段类型><字段名称>[=<默认值>][;|,|不写]
}

例如:

arduino
复制代码
struct User {
    1:required string name,// required表示该字段必须填写
    2:optional i32 age = 0;// =为默认值
    3:bool gender//不写默认字段类型为optional
}

struct有以下一些约束:

  • struct不能继承,但是可以嵌套,不能嵌套自己。
  • 其成员都是有明确类型
  • 成员是被正整数编号过的,其中的编号是不能重复的,这个是为了在传输过程中编码使用。
  • 成员分割符可以是逗号(,)或是分号(:)或者不写,可以混用,但最好统一
  • 字段会有optionalrequired之分和protobuf一样,但是如果不指定则为无类型,可以不填充该值,但是在序列化传输的时候也会序列化进去,optional是不填充则不序列化,不写为optionalrequired是必须填充也必须序列化。
  • 每个字段可以设置默认值
  • 同一文件可以定义多个struct,也可以定义在不同的文件,进行include引入。

枚举(enum)

thrift不支持枚举类嵌套,枚举常量必须是32位的正整数

ini
复制代码
enum Httpstatus {
    OK = 200,
    NOTFOUND = 404
}

异常(Exceptions)

异常在语法和功能上类似于结构体,差别是异常使用关键字exception,而且异常是继承每种语言的基础异常类。

csharp
复制代码
exception MyException{
    1:i32 errorcode
    2:string message
}
service Exampleservice {
    string GetName()throws (1:MyException e)
}

service(服务定义类型)

服务的定义方法在语义上等同于面向对象语言中的接口

scss
复制代码
service HelloService {
    i32 sayInt(1:i32 param)
    string saystring(1:string param)
    bool sayBoolean(1:bool param)
    void sayvoid()
}

namespace(命名空间)

类似于其他语言的包名,用.划分层级

注释

和其他语言一样。//单行注释,/* */ 多行注释

include

定义在不同的文件的struct,可用include引入,注意是要加""

makefile
复制代码
include "test.thrift"

参考

Apache Thrift - Home

各种语言调用示例参考这里