thrift idl 定义语法小认识

发布时间 2023-09-29 21:46:05作者: Lucky小黄人^_^

内容来自对 chatgpt 的提问

案例

Apache Thrift是一种著名的跨语言服务开发框架。在Thrift中,IDL(接口定义语言)用于定义服务接口和数据类型。以下是如何在 Thrift 的 IDL 中定义一个结构体(Struct):

下面这个案例表示一个拥有名字,年龄,婚姻状况,爱好以及其它属性的人的数据模型。

struct Person {
    1: string name,
    2: i32 age,
    3: bool is_married,
    4: list<string> hobbies,
    5: map<string, string> attributes
}

案例解释

在这个Person结构体的定义中:

  1. 1, 2, 3, 4, 5 是每个字段的编号,这是字段在编译时的标识符,一旦设置了就不应该修改,否则会导致兼容性问题。只要已有的字段的序号不变,后续如果新增非 required 类型的字段,也不需要升级当前调用该接口的服务。

  2. string,i32,bool,list,map 是数据类型。Thrift支持多种数据类型,包括基本类型(如string,i32,double,bool等),容器类型(如list,set,map)和用户自定义类型。

  3. name,age,is_married,hobbies,attributes 是字段的名称,这些是在你的代码中使用的字段标识符。字段名一般采用蛇形命名法(多个单词使用下划线分割)

特别注意:

  1. 所有的字段编号必须是唯一的。同一个结构体里序号不能重复。

  2. 字段的类型可以是内建的数据类型,也可以是用户自定义的其它结构体或服务。

  3. 字段可以添加 optionalrequired 修饰符来标识这个字段是否必须。如果没有指定,则默认为 optional

  • 要注意的是,使用 required 需要谨慎,因为一旦将字段声明为必需,在之后的版本中在结构中删除或更改这些字段,可能会导致向后兼容性的问题。这就是为什么在大多数情况下,推荐使用optional来声明字段。
  • 在一般的idl 结构体转成其他编程语言的结构体时,一般会把没有标 optionalrequired 的字段转成指针类型,指针类型如果为空值,一般在序列化时不会存储,这样在网络传输时能节省一些开销。