Apache Thrift - 接口定义语言
Apache Thrift 的接口定义语言 (IDL) 是一种声明性语言,用于以独立于任何特定编程语言的方式定义数据和服务的结构。
它使您能够以简单、人性化、可读的格式描述数据类型、服务方法及其交互。然后,Thrift 编译器使用此 IDL 生成多种语言的代码,这些代码可用于实现定义的服务并与之交互。
Thrift IDL 的结构
Thrift IDL 文件使用 .thrift 文件扩展名并遵循简单的语法。 Thrift IDL 文件的基本结构包括数据类型、常量、枚举、结构和服务的定义。
以下是 Thrift IDL 结构的简单分解:
命名空间
命名空间有助于组织 IDL 定义并防止命名冲突。您可以使用 namespace 关键字为不同的编程语言定义命名空间。每个命名空间指令指定目标语言和相应的命名空间:
namespace java com.example.thrift namespace py example.thrift
在此示例中:
- namespace java com.example.thrift 定义从 IDL 文件生成的 Java 代码的命名空间。
- namespace py example.thrift 定义从 IDL 文件生成的 Python 代码的命名空间。
数据类型
Thrift 支持几种基本数据类型,您可以使用它们来定义数据的结构。一些基本类型包括:
- bool:布尔值(真或假)。
- byte:8 位整数。
- i16:16 位整数。
- i32:32 位整数。
- i64:64 位整数。
- double:双精度浮点数。
- string:字符序列。
- binary:字节序列(用于原始数据)。
结构
结构用于定义复杂数据类型具有命名字段。结构中的每个字段都分配有一个唯一标识符 (ID),并具有特定的数据类型。字段可以标记为可选或必需。以下是示例:
struct User { 1: i32 id 2: string name 3: bool is_active }
在此 User 结构中:
- 1、2 和 3 是用于序列化的字段 ID(唯一整数)。
- i32、string 和 bool 是字段的数据类型。
- id、name 和 is_active 是字段名称。
枚举
枚举(枚举的简称)用于定义一组命名常量。枚举中的每个常量都分配有一个整数值,默认情况下从 0 开始。您可以根据需要为常量指定自定义值。以下是示例:
enum Status { ACTIVE = 1 INACTIVE = 2 PENDING = 3 }
在此""Status"枚举中 :
- ACTIVE、INACTIVE 和 PENDING 是可能的值。
- 每个值都与一个整数相关联。
union 联合
在 Apache Thrift IDL 中,union 联合是一种特殊类型的数据结构,可以一次容纳多个可能字段之一。
与可以同时容纳多个字段的结构不同,联合一次只能容纳一个字段。以下是示例:
union Result { 1: string message 2: i32 errorCode }
在此示例中:
- "Result"是联合的名称。
- 它可以有一个名为"message"的"string"字段或一个名为"errorCode"的"i32"字段,但不能同时有两者。
定义服务
服务定义可以执行的操作和公开的方法。每个服务都包含一个方法列表,每个方法都指定参数和返回类型。以下是示例:
语法
以下是在 Apache Thrift 中定义服务的基本语法:
service ServiceName { <returnType> <methodName>(<parameterList>) throws (<exceptionList>) }
此处,service 关键字后跟服务的名称。在花括号内,每个方法都定义了其返回类型、方法名称、参数列表以及它可能引发的任何异常。
示例
在以下示例中,"UserService"是具有两种方法的服务。"getUserById"采用 i32 ID 并返回"User"结构。它可能会引发"UserNotFoundException"。"updateUser"采用"User"结构但不返回任何内容(void)。:
- getUserById 采用 i32 ID 并返回 User 结构。
- updateUser 采用 User 结构但不返回任何内容(void)。
service UserService { User getUserById(1: i32 id) throws (1: UserNotFoundException e) void updateUser(1: User user) }
定义异常
异常用于处理服务方法调用期间发生的错误。您可以像结构一样定义它们,但使用 exception 关键字:
语法
以下是在 Apache Thrift 中定义异常的基本语法:
exception ExceptionName { 1: <type> <fieldName> }
此处,exception 关键字后跟异常的名称。在花括号内,异常的每个字段都使用唯一的整数 ID、数据类型和字段名称进行定义。
示例
在以下示例中,"UserNotFoundException"是具有一个字段的异常,"message"是 ID 为 1 的字符串,用于保存错误消息:
exception UserNotFoundException { 1: string message }
Apache Thrift 中的容器
在 Apache Thrift IDL 中,容器用于将多个值组合在一起。它们有三种类型:列表、集合和映射。每种类型都有不同的用途,并具有自己的特点:
- 列表:允许重复的有序元素集合。以下是语法示例 −
list<string> names
这定义了一个名为"names"的列表,其中每个元素都是一个"字符串"。
set<i32> numbers
这定义了一个名为"numbers"的集合,其中每个元素都是一个 32 位整数 (i32)。
map<string, i32> ageMap
这定义了一个名为"ageMap"的映射,其中每个键都是一个"字符串"(例如,一个人的姓名),每个值都是一个"i32"(例如,他们的年龄)。