Apicurio Registry 用户指南
在 Apicurio Registry 3.0 中管理模式和 API
摘要
前言 复制链接链接已复制到粘贴板!
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
对红帽文档提供反馈
我们感谢您对我们文档的反馈。
要进行改进,请创建一个 Jira 问题,并描述您推荐的更改。尽可能提供更详细的信息,以便我们快速解决您的请求。
前提条件
-
您有一个红帽客户门户网站帐户。此帐户允许您登录到 Red Hat Jira Software 实例。
如果您没有帐户,系统会提示您创建一个帐户。
流程
- 单击以下链接: 创建问题。
- 在 Summary 文本框中,输入问题的简短描述。
在 Description 文本框中,提供以下信息:
- 找到此问题的页面的 URL。
-
有关此问题的详细描述。
您可以将信息保留在任何其他字段中,使其默认值。
- 点 Create 将 JIRA 问题提交到文档团队。
感谢您抽出时间提供反馈。
第 1 章 Apicurio Registry 简介 复制链接链接已复制到粘贴板!
本章介绍了 Apicurio Registry 概念和功能,并提供了有关 registry 中存储的支持的工件类型的详情:
- 第 1.1 节 “什么是 Apicurio Registry?”
- 第 1.2 节 “Apicurio Registry 中的 schema 和 API 工件”
- 第 1.3 节 “使用 Apicurio Registry web 控制台管理内容”
- 第 1.4 节 “用于客户端的 Apicurio Registry REST API”
- 第 1.5 节 “Apicurio Registry 存储选项”
- 第 1.6 节 “使用 schema 和 Java 客户端序列化器/反序列化器验证 Kafka 消息”
- 第 1.7 节 “使用 Kafka Connect 转换器将数据流传输到外部系统”
- 第 1.8 节 “Apicurio Registry 演示示例”
- 第 1.9 节 “Apicurio Registry 可用发行版本”
1.1. 什么是 Apicurio Registry? 复制链接链接已复制到粘贴板!
Apicurio Registry 是一个数据存储,用于在事件驱动的和 API 构架间共享标准事件模式和 API 设计。您可以使用 Apicurio Registry 将数据的结构与客户端应用程序分离,并使用 REST 接口在运行时共享和管理您的数据类型和 API 描述。
客户端应用程序可以在运行时动态向 Apicurio Registry 或从 Apicurio Registry 推送或拉取最新的 schema 更新,而无需重新部署。开发人员团队可以查询 Apicurio Registry 以获取已在生产中部署的服务所需的现有模式,并可注册开发中新服务所需的新模式。
您可以通过在客户端应用程序代码中指定 Apicurio Registry URL 来启用客户端应用程序使用模式和 API 设计。Apicurio Registry 可以存储用于序列化和反序列化消息的模式,这些消息从客户端应用程序引用,以确保它们发送和接收的消息与这些模式兼容。
使用 Apicurio Registry 将数据结构与应用程序分离,方法是降低整体消息大小降低成本,并通过增加跨机构的模式和 API 设计的一致重复使用来提高效率。Apicurio Registry 提供了一个 Web 控制台,方便开发人员和管理员管理 registry 内容。
您可以配置可选规则来管理 Apicurio Registry 内容的演进。这包括确保上传的内容有效或与其他版本兼容的规则。任何配置的规则都必须在将新版本上传到 Apicurio Registry 前传递,这样可确保时间在无效或不兼容的模式或 API 设计中不会受到影响。
Apicurio Registry 基于 Apicurio Registry 开源社区项目。详情请查看 https://www.apicur.io/registry/。
Apicurio Registry 功能
- 标准事件模式和 API 规格的多个有效负载格式,如 Apache Avro、JSON Schema、Google Protobuf、AsyncAPI、OpenAPI 等。
- 可插拔 Apicurio Registry 存储选项,用于将内容存储在 AMQ Streams 或 PostgreSQL 数据库中。
- 内容验证、兼容性和完整性规则,以管理 Apicurio Registry 内容随时间变化的方式。
- 使用 Web 控制台、REST API、命令行、Maven 插件或语言 SDK 管理 Apicurio Registry 内容管理。
- 完整的 Apache Kafka 模式 registry 支持,包括与外部系统的 Kafka Connect 集成。
- Kafka 客户端序列化器/反序列化器(SerDes),在运行时验证消息类型。
- 与现有 Confluent 模式 registry 客户端应用程序兼容。
- 用于低内存占用和快速部署时间的云原生 Quarkus Java 运行时。
- 基于 Operator 的 Apicurio Registry 在 OpenShift/Kubernetes 上安装。
- 使用红帽构建的 Keycloak 进行 OpenID Connect (OIDC)身份验证。
1.2. Apicurio Registry 中的 schema 和 API 工件 复制链接链接已复制到粘贴板!
存储在 Apicurio Registry 中的项目,如事件模式和 API 设计,称为 registry 工件。下面显示了一个简单共享价格应用程序的 JSON 格式的 Apache Avro 模式工件示例:
Avro 模式示例
{
"type": "record",
"name": "price",
"namespace": "com.example",
"fields": [
{
"name": "symbol",
"type": "string"
},
{
"name": "price",
"type": "string"
}
]
}
当将 schema 或 API 设计添加到 Apicurio Registry 中的工件时,客户端应用程序可以使用该 schema 或 API 设计来验证客户端消息在运行时符合正确的数据结构。
工件具有元数据,包括生成且可编辑的。工件的标准元数据包括(但不仅限于):
1.2.1. 生成或不可变属性 复制链接链接已复制到粘贴板!
- groupId
- artifactId
- artifactType
- createdOn
- modifiedBy
- modifiedOn
1.2.2. 可编辑的属性 复制链接链接已复制到粘贴板!
- 名称
- description
- labels
- owner
工件版本
每个工件都由零个或多个 _artifact version_s 组成。只有工件版本具有实际内容(以及元数据)。这些版本代表工件内容的演进,并且是不可变的。您可以将 Artifact 视为一系列版本,通常使用代表"current"模式或 API 设计内容的最新版本。
工件版本具有元数据,它们都生成且可编辑。工件版本的标准元数据包括(但不仅限于):
1.2.3. 生成或不可变属性 复制链接链接已复制到粘贴板!
- groupId
- artifactId
- version
- globalId
- contentId
- owner
- createdOn
- modifiedBy
- modifiedOn
1.2.4. 可编辑的属性 复制链接链接已复制到粘贴板!
- 名称
- description
- labels
- state
模式和 API 组
工件组是 schema 或 API 工件的可选命名集合。每个组都包含一组逻辑相关的模式或 API 设计,通常由单个实体管理,这些实体属于特定的应用程序或组织。
在添加 schema 和 API 设计时,您可以创建可选工件组,以便在 Apicurio Registry 中组织它们。例如,您可以创建组来匹配 development 和 production 的应用程序环境,或 sales 和 engineering 机构。
schema 和 API 组可以包含多个工件类型。例如,您可能具有 Protobuf、Avro、JSON Schema、OpenAPI 或 AsyncAPI 工件。
组具有元数据,包括生成和可编辑的元数据。组的标准元数据包括(但不仅限于):
1.2.5. 生成或不可变属性 复制链接链接已复制到粘贴板!
- groupId
- owner
- createdOn
- modifiedBy
- modifiedOn
1.2.6. 可编辑的属性 复制链接链接已复制到粘贴板!
- description
- labels
您可以使用 Apicurio Registry web 控制台、REST API、命令行、Maven 插件或 Java 客户端应用程序创建 schema 和 API 工件和组。
在使用 Apicurio Registry web 控制台时,指定组是可选的,并且自动使用默认组。使用 REST API 或 Maven 插件时,如果您不想创建唯一组,请在 API 路径中指定 默认组。
对其他模式和 API 的引用
一些 Apicurio Registry 工件类型可以包含从一个 工件文件到另一个工件的工件引用。您可以通过定义可重复使用的模式或 API 组件来创建效率,然后从多个位置引用它们。例如,您可以使用 $ref 语句在 JSON Schema 或 OpenAPI 中指定引用,或使用 导入 声明在 Google Protobuf 中指定引用,或使用嵌套命名空间在 Apache Avro 中指定引用。
以下示例显示了一个名为 TradeKey 的简单 Avro 模式,其中包含使用嵌套命名空间对另一个名为 Exchange 的 schema 的引用:
带有嵌套交换模式的 Tradekey 模式
{
"namespace": "com.kubetrade.schema.trade",
"type": "record",
"name": "TradeKey",
"fields": [
{
"name": "exchange",
"type": "com.kubetrade.schema.common.Exchange"
},
{
"name": "key",
"type": "string"
}
]
}
Exchange 模式
{
"namespace": "com.kubetrade.schema.common",
"type": "enum",
"name": "Exchange",
"symbols" : ["GEMINI"]
}
工件引用存储在 Apicurio Registry 中,作为工件元数据的集合,这些元数据从特定于工件类型的引用映射到内部 Apicurio Registry 引用。Apicurio Registry 中的每个工件引用都包含以下内容:
- 组 ID
- 工件 ID
- 工件版本
- 工件引用名称
您可以使用 Apicurio Registry core REST API、Maven 插件和 Java serializers/deserializers (SerDes)管理工件引用。Apicurio Registry 存储工件引用以及工件内容。Apicurio Registry 还维护所有工件引用的集合,以便您可以搜索或列出特定工件的所有引用。
支持的工件类型
Apicurio Registry 目前仅支持以下工件类型引用:
- Avro
- protobuf
- JSON 架构
- OpenAPI
- AsyncAPI
1.3. 使用 Apicurio Registry web 控制台管理内容 复制链接链接已复制到粘贴板!
您可以使用 Apicurio Registry web 控制台浏览和搜索存储在 registry 中的 schema 和 API 工件和可选组,并添加新的 schema 和 API 工件、组和版本。您可以通过标签、名称、组和描述搜索工件。您可以查看工件的内容或可用版本,或在本地下载工件文件。
您还可以为 registry 内容、全局、组以及每个 schema 和 API 工件配置可选规则。当新 schema 和 API 工件或版本上传到 registry 时,会应用这些用于内容验证和兼容性的可选规则。
如需了解更多详细信息,请参阅 第 10 章 Apicurio Registry 内容规则参考。
图 1.1. Apicurio Registry web 控制台
Apicurio Registry web 控制台从 http://MY_REGISTRY_UI_URL/ 获得。
1.4. 用于客户端的 Apicurio Registry REST API 复制链接链接已复制到粘贴板!
客户端应用程序可以使用 Core Registry API v3 来管理 Apicurio Registry 中的 schema 和 API 工件。此 API 为以下功能提供操作:
- Admin
-
在
.zip文件中导出或导入 Apicurio Registry 数据,并在运行时管理 Apicurio Registry 的日志记录级别。 - 组
- 管理 Apicurio Registry 中的工件组。您可以创建组来更好地组织工件。
- 组规则
- 配置规则以监管特定组中的模式或 API 工件的内容演进,以防止将无效或不兼容的内容添加到 Apicurio Registry 中。组规则覆盖配置的任何全局规则。
- 工件
- 管理存储在 Apicurio Registry 中的 schema 和 API 工件。
- 工件元数据
- 管理 schema 或 API 工件的详情。您可以编辑工件名称、描述或标签等详情。详情,如工件组,以及工件被创建或修改的时间是只读的。
- 工件规则
- 配置规则以监管特定模式或 API 工件的内容演进,以防止将无效或不兼容的内容添加到 Apicurio Registry 中。工件规则覆盖配置的任何组和/或全局规则。
- 工件版本
- 管理组成 schema 或 API 工件内容的版本序列。您还可以管理工件版本的生命周期状态:enabled、disabled 或 deprecated。
- 全局规则
- 配置规则以管理所有模式和 API 工件的内容演进,以防止将无效或不兼容的内容添加到 Apicurio Registry 中。只有在工件及其组没有配置规则时,才会应用全局规则。
- 搜索
- 浏览或搜索 schema 和 API 工件和版本,例如按名称、组、描述或标签。
- System
- 获取 Apicurio Registry 服务器的资源的限制。
- 用户
- 获取当前的 Apicurio Registry 用户。
与其他 schema registry REST API 兼容
Apicurio Registry 还通过包括其各自 REST API 的实现来提供与以下模式 registry 的兼容性:
- Apicurio Registry Core Registry API v2
- Confluent Schema Registry API v7
使用 Confluent 客户端库的应用程序可以使用 Apicurio Registry 作为替换。如需了解更多详细信息,请参阅 替换 Confluent Schema Registry。
1.5. Apicurio Registry 存储选项 复制链接链接已复制到粘贴板!
Apicurio Registry 为 registry 数据的底层存储提供以下选项:
| 存储选项 | 描述 |
|---|---|
| PostgreSQL 数据库 | PostgreSQL 是生产环境中的性能、稳定性和数据管理(备份/恢复等)的建议数据存储选项。 |
| AMQ Streams | 为无法使用数据库管理专业知识或 Kafka 中的存储特定要求的生产环境提供 Kafka 存储。 |
1.6. 使用 schema 和 Java 客户端序列化器/反序列化器验证 Kafka 消息 复制链接链接已复制到粘贴板!
Kafka 生成者应用程序可以使用 serializers 对符合特定事件模式的信息进行编码。然后,Kafka 消费者应用程序可以使用 deserializers 根据特定的模式 ID 验证消息已使用正确的模式序列化。
图 1.2. Apicurio Registry 和 Kafka 客户端 SerDes 架构
Apicurio Registry 提供 Kafka 客户端序列化器/反序列化器(SerDes)来在运行时验证以下消息类型:
- Apache Avro
- Google Protobuf
- JSON 架构
Apicurio Registry Maven 存储库和源代码分布包括这些消息类型的 Kafka SerDes 实现,Kafka 客户端应用程序开发人员可用于与 Apicurio Registry 集成。
这些实现包括每种支持的消息类型的自定义 Java 类,如 io.apicurio.registry.serde.avro,客户端应用程序可在运行时用于从 Apicurio Registry 中拉取模式进行验证。
1.7. 使用 Kafka Connect 转换器将数据流传输到外部系统 复制链接链接已复制到粘贴板!
您可以使用带有 Apache Kafka Connect 的 Apicurio Registry 在 Kafka 和外部系统之间流数据。使用 Kafka Connect,您可以为不同的系统定义连接器,将大量数据移到基于 Kafka 的系统中。
图 1.3. Apicurio Registry 和 Kafka 连接架构
Apicurio Registry 为 Kafka Connect 提供以下功能:
- Kafka Connect 模式的存储
- Apache Avro 和 JSON Schema 的 Kafka Connect 转换器
- 用于管理模式的核心 Registry API
您可以使用 Avro 和 JSON Schema 转换器将 Kafka Connect 模式映射到 Avro 或 JSON 模式。然后,这些模式可以将消息键和值序列化为紧凑 Avro 二进制格式或人类可读的 JSON 格式。转换的 JSON 更为详细,因为消息不包含 schema 信息,而只会包含模式 ID。
Apicurio Registry 可以管理和跟踪 Kafka 主题中使用的 Avro 和 JSON 模式。由于 schema 存储在 Apicurio Registry 中,并且与消息内容分离,因此每个消息都必须仅包含 tiny 模式标识符。对于如 Kafka 的 I/O 绑定系统,这意味着生产者和消费者的总吞吐量。
Apicurio Registry 提供的 Avro 和 JSON Schema serializers 和反序列化器(SerDes)在此用例中由 Kafka 生成者和消费者使用。您写入的 Kafka 消费者应用程序可以使用 Avro 或 JSON SerDe 来反序列化这些事件。您可以在任何基于 Kafka 的系统上安装 Apicurio Registry SerDes,并将它们与 Kafka Connect 一起使用,或与基于 Kafka Connect 的系统(如 Debezium)一起使用。
1.8. Apicurio Registry 演示示例 复制链接链接已复制到粘贴板!
Apicurio Registry 提供开源示例应用程序,它们演示了如何在不同用例中使用 Apicurio Registry。例如,包括 Kafka serializer 和 deserializer (SerDes) Java 类使用的存储模式。这些类从 Apicurio Registry 获取 schema,以便在生成或消耗操作来序列化、反序列化或验证 Kafka 消息有效负载时使用。
这些应用程序演示了诸如以下示例的用例:
- Apache Avro Kafka SerDes
- Apache Avro Maven 插件
- Apache Camel Quarkus 和 Kafka
- CloudEvents
- Confluent Kafka SerDes
- 自定义 ID 策略
- 使用 Debezium 的事件驱动的架构
- Google Protobuf Kafka SerDes
- JSON Schema Kafka SerDes
- REST 客户端
1.9. Apicurio Registry 可用发行版本 复制链接链接已复制到粘贴板!
Apicurio Registry 提供以下组件作为其分发的一部分。
| 分发 | 位置 | 发行类别 |
|---|---|---|
| Apicurio Registry Operator | Operators → OperatorHub下的 OpenShift Web 控制台 | 公开发行 |
| Apicurio Registry Operator 的容器镜像 | 公开发行 | |
| Apicurio Registry 的容器镜像(Back End) | 公开发行 | |
| Apicurio Registry 的容器镜像(用户界面) | 公开发行 |
| 分发 | 位置 | 发行类别 |
|---|---|---|
| 安装的自定义资源定义示例 | 公开发行 | |
| Maven 存储库 | 公开发行 | |
| 源代码 | 公开发行 | |
| Kafka Connect 转换器 | 公开发行 |
您必须有 Red Hat Application Foundation 订阅并登录到红帽客户门户网站,才能访问可用的 Apicurio Registry 发行版。
第 2 章 Apicurio Registry 内容规则 复制链接链接已复制到粘贴板!
本章介绍了用于管理 Apicurio Registry 内容的可选规则,并提供了有关可用规则配置的详情:
2.1. 使用规则管理 Apicurio Registry 内容 复制链接链接已复制到粘贴板!
要管理添加到 Apicurio Registry 中的工件内容的演进,您可以配置可选规则。所有配置的全局规则、特定于组的规则或工件规则都必须通过,然后才能将新工件版本添加到 Apicurio Registry。配置的特定于工件的规则会覆盖任何配置的特定于组的规则,这些规则又覆盖任何配置的全局规则。
这些规则的目的是防止将无效内容添加到 Apicurio Registry 中,并控制工件的演进(例如,检查新工件版本与之前的版本的兼容性)。例如,内容可能会因为以下原因无效:
-
给定工件类型的无效语法,如
AVRO或PROTOBUF。 - 有效的语法,但语义违反了规范。
- 不兼容性,当新内容包含与当前工件版本相关的破坏更改时。
- 工件引用完整性,例如副本或不存在的工件引用映射。
您可以使用 Apicurio Registry web 控制台、REST API 命令或使用其中一个 SDK 来启用可选内容规则。
2.1.1. 应用规则时 复制链接链接已复制到粘贴板!
只有在内容添加到 Apicurio Registry 时,才会应用规则。这包括以下 REST 操作:
- 添加工件
- 添加工件版本
如果违反了规则,Apicurio Registry 会返回 HTTP 错误。响应正文包括违反的规则,以及显示出错的消息。
2.1.2. 规则的优先级顺序 复制链接链接已复制到粘贴板!
特定于工件和全局规则的优先级顺序如下:
- 特定于工件的规则具有最高的优先级
- 特定于组的规则具有下一个最高优先级
- 全局规则具有最低优先级
如果在更高级别上配置一条规则(例如在全局级别上),但您希望在较低级别上禁用该规则,您必须在较低级别上配置相同的规则(因此,它会覆盖它),并将其 rules 值设置为 NONE。
2.1.3. 规则的工作方式 复制链接链接已复制到粘贴板!
每个规则都有一个名称和配置信息。Apicurio Registry 维护每个工件、每个组以及全局规则列表的规则列表。列表中的每一规则均由规则实施的名称和配置组成。
执行规则时,会提供当前工件版本的内容(如果存在)以及正在添加的工件的新版本。规则实现会返回或失败,具体取决于工件是否通过规则。如果没有,Apicurio Registry 会报告 HTTP 错误响应的原因。有些规则可能无法使用之前版本的内容。例如,兼容性规则使用以前的版本,但语法或语义有效规则不会。
2.1.4. 内容规则配置 复制链接链接已复制到粘贴板!
管理员可以配置 Apicurio Registry 全局规则、特定于组的规则和特定于工件的规则。开发人员只能配置特定于组的规则,以及特定于工件的规则。
Apicurio Registry 应用为特定工件配置的规则。如果在该级别上没有配置任何规则,则 Apicurio Registry 会应用特定于组的规则。如果在组级别没有配置任何规则,则 Apicurio Registry 会应用全局配置的规则。如果没有配置全局规则,则不应用任何规则。
配置组和工件特定规则
您可以使用 Apicurio Registry web 控制台或 REST API 配置特定于组的规则和特定于工件的规则。详情请查看以下内容:
配置全局规则
管理员可以以多种方式配置全局规则:
-
在 REST API 中使用
admin/rules操作 - 使用 Apicurio Registry web 控制台
- 使用 Apicurio Registry 应用程序属性设置默认全局规则
配置默认的全局规则
管理员可以在应用程序级别配置 Apicurio Registry,以启用或禁用全局规则。您可以使用以下 application 属性格式在安装时配置默认的全局规则,而无需安装后配置:
apicurio.rules.global.<ruleName>
目前支持以下规则名称:
-
兼容性 -
有效期 -
完整性
application 属性的值必须是有效的配置选项,它特定于所配置的规则。
您可以将这些应用程序属性配置为 Java 系统属性,或者将其包含在 Quarkus application.properties 文件中。如需了解更多详细信息,请参阅 Quarkus 文档。
第 3 章 使用 Web 控制台管理 Apicurio Registry 内容 复制链接链接已复制到粘贴板!
您可以使用 Apicurio Registry web 控制台管理 Apicurio Registry 中存储的 schema 和 API 工件。这包括上传和浏览 Apicurio Registry 内容,为内容配置可选规则并生成客户端 sdk 代码:
3.1. 使用 Apicurio Registry web 控制台查看工件 复制链接链接已复制到粘贴板!
您可以使用 Apicurio Registry web 控制台浏览存储在 Apicurio Registry 中的 schema 和 API 工件。本节展示了查看 Apicurio Registry 组、工件、版本和规则的简单示例。
先决条件
- Apicurio Registry 在您的环境中安装并运行。
已登陆到 Apicurio Registry web 控制台:
http://MY_REGISTRY_UI_URL/- 使用 Web 控制台、命令行、Maven 插件或客户端应用程序将工件添加到 Apicurio Registry 中。
流程
在 Explore 选项卡中,浏览存储在 Apicurio Registry 中的工件列表,或者输入搜索字符串来查找工件。您可以从列表中选择按特定条件进行搜索,如名称、组、标签或全局 ID。
图 3.1. Apicurio Registry web 控制台中的工件
点工件查看以下详情:
- 概述 :显示工件元数据,如工件 ID、名称、描述、标签等。另外,还显示您可以为工件内容配置的有效性和兼容性规则。
- 版本 :显示所有工件版本的列表。这将为空,除非您在创建工件时上传第一个版本。
分支 :显示工件的分支列表。这将至少显示最新的
分支,但可能会根据您的配置显示其他生成的分支。图 3.2. Apicurio Registry web 控制台中的工件详情
点 Versions 选项卡查看所有工件版本的列表。然后,单击列表中的某个版本,或者从列表中某个版本的 Action 菜单中选择 View Version。然后,您会看到以下工件版本详情:
- 概述 :显示工件版本元数据,如版本名称、描述、全局 ID、内容 ID、标签等。另外,还显示为工件版本创建的任何注释。
- 文档 (仅限 OpenAPI 和 AsyncAPI):显示自动生成的 REST API 文档。
- 内容 :显示完整工件版本内容的只读视图。对于 JSON 内容,您可以点 JSON 或 YAML 来显示您首选的格式。
引用 :显示此工件版本引用的所有工件的只读视图。您还可以点引用此 工件版本的 View 工件。
图 3.3. Apicurio Registry web 控制台中的工件版本详情
-
要将工件内容保存到本地文件,如
my-openapi.json或my-protobuf-schema.proto,然后点 Download。
3.2. 使用 Apicurio Registry web 控制台添加工件 复制链接链接已复制到粘贴板!
您可以使用 Apicurio Registry web 控制台将 schema 和 API 工件上传到 Apicurio Registry。本节演示了创建 Apicurio Registry 工件和添加新工件版本的简单示例。
先决条件
- Apicurio Registry 在您的环境中安装并运行。
已登陆到 Apicurio Registry web 控制台:
http://MY_REGISTRY_UI_URL/
流程
在 Explore 选项卡中,点 Create artifact,然后完成 Create artifact 向导:
注意您可以创建一个没有内容的占位符工件,但您必须指定工件类型,因为 Apicurio Registry 无法自动检测内容类型。通过创建占位符,您可以先创建规则并在稍后添加内容。
指定 Artifact Coordinates 并点 Next :
-
组 ID 和 Artifact ID :使用默认空设置自动生成工件 ID,并将工件
添加到默认工件组中。另外,您可以输入可选的工件组或工件 ID。 - 类型 :使用默认 Auto-Detect 设置来自动检测工件类型(如果创建空工件时不允许),或者从列表中选择工件类型,如 Avro Schema 或 OpenAPI。您必须手动选择 Kafka Connect Schema 工件类型,该工件类型无法自动检测到。
-
组 ID 和 Artifact ID :使用默认空设置自动生成工件 ID,并将工件
指定 Artifact Metadata 并点 Next :
- Name :输入新工件的可选友好名称。
- 描述 :输入新工件的可选描述。
- 标签 :(可选)为新工件添加一个或多个标签(名称/值对)。
指定 Version 内容 并点 Next :
- 版本号 :创建第一个版本时可选添加版本字符串。
Content: 使用以下选项之一指定内容:
-
从文件 中:单击 Browse,然后选择一个文件,或者拖放文件。例如,
my-openapi.json或my-schema.proto。或者,您可以在文本框中输入文件内容。 -
从 URL :输入有效且可访问的 URL,然后单击 Fetch。例如:
https://petstore3.swagger.io/api/v3/openapi.json。
-
从文件 中:单击 Browse,然后选择一个文件,或者拖放文件。例如,
指定 版本元数据 :
- Name :输入第一个工件版本的可选友好名称。
- 描述 :输入第一个工件版本的可选描述。
- 标签 :(可选)为第一个工件版本添加一个或多个标签(名称/值对)。
点 Create 并查看工件详情:
- 概述 :显示工件元数据,如工件 ID、名称、描述、标签等。另外,还显示您可以为工件内容配置的有效性和兼容性规则。
- 版本 :显示所有工件版本的列表。这将为空,除非您在创建工件时上传第一个版本。
分支 :显示工件的分支列表。这将至少显示最新的
分支,但可能会根据您的配置显示其他生成的分支。以下示例显示了 Apache Avro 工件示例:
图 3.4. Apicurio Registry web 控制台中的工件详情
在 Overview 选项卡中,点 Edit pencil 图标来编辑工件元数据,如名称或描述。
您还可以为分类和搜索目的添加零个或多个标签(名称 + 值)。要添加标签,请执行以下步骤:
- 点 Add label。
- 输入键名称和值(可选)。
- 重复前两个步骤来添加多个属性。
- 点击 Save。
-
要将工件内容保存到本地文件,如
my-protobuf-schema.proto或my-openapi.json,请点击页面末尾的 Download。 要添加新的工件版本,请切换到 Versions 选项卡,然后在工具栏中点 Create version。从那里提供以下信息:
- 版本号 :(可选):为新版本添加版本字符串。
Content: 使用以下选项之一指定内容:
-
从文件 中:单击 Browse,然后选择一个文件,或者拖放文件。例如,
my-openapi.json或my-schema.proto。或者,您可以在文本框中输入文件内容。 -
从 URL :输入有效且可访问的 URL,然后单击 Fetch。例如:
https://petstore3.swagger.io/api/v3/openapi.json。
-
从文件 中:单击 Browse,然后选择一个文件,或者拖放文件。例如,
- 现在,您可以点 Create 按钮创建新版本。
要删除工件,请在页面标头中点 Delete。
警告删除工件会删除工件及其所有版本,且无法撤销。
3.3. 使用 Apicurio Registry web 控制台配置内容规则 复制链接链接已复制到粘贴板!
您可以使用 Apicurio Registry web 控制台配置可选规则,以防止将无效或不兼容的内容添加到 Apicurio Registry 中。所有配置的工件、特定于组的或全局规则都必须通过,然后才能将新工件版本上传到 Apicurio Registry。配置的特定于工件的规则会覆盖任何配置的特定于组的规则,这些规则又覆盖任何全局规则。本节展示了配置全局、特定于组以及特定于工件的规则的简单示例。
先决条件
- Apicurio Registry 在您的环境中安装并运行。
已登陆到 Apicurio Registry web 控制台:
http://MY_REGISTRY_UI_URL/- 使用 Web 控制台、命令行、Maven 插件或 Java 客户端应用程序将工件添加到 Apicurio Registry 中。
- 启用基于角色的授权后,您可以具有全局规则配置的管理员访问权限。
流程(特定于组的规则)
- 在 Explore 选项卡中,通过从 "Search for" 菜单中选择 Groups 来浏览 Apicurio Registry 中的组列表。
- 点组查看其详情和内容规则。
在 特定于组的规则中,点 Enable 为组中所有工件内容配置有效、兼容性或完整性规则,然后从列表中选择适当的规则配置。例如,对于 Validity 规则,请选择 Full。
图 3.5. Apicurio Registry web 控制台中的特定于组的规则
流程(特定于工件的规则)
- 在 Explore 选项卡中,通过从 "Search for" 菜单中选择 Artifacts 来浏览 Apicurio Registry 中的工件列表。
- 点列表中的工件来查看其详情和内容规则。
在 Artifact-specific rules 中,点 Enable 为工件内容配置有效、兼容性或完整性规则,然后从列表中选择适当的规则配置。例如,对于 Validity 规则,请选择 Full。
图 3.6. Apicurio Registry web 控制台中的工件内容规则
流程(全局规则)
- 要访问全局规则,请点 Global rules 选项卡。
点 Enable 为所有工件内容配置全局有效期、兼容性或完整性规则,然后从列表中选择适当的规则配置。
图 3.7. Apicurio Registry web 控制台中的工件内容规则
要禁用特定于工件、特定于组的或全局规则,请点规则旁边的垃圾箱图标。如果您这样做,并且规则在更高级别上配置(如 Global),则更高级别规则配置将再次应用。
3.4. 使用 Apicurio Registry web 控制台更改工件所有者 复制链接链接已复制到粘贴板!
作为管理员或作为 schema 或 API 工件的所有者,您可以使用 Apicurio Registry web 控制台将工件所有者更改为另一个用户帐户。
例如,如果为 Settings 选项卡上的 Apicurio Registry 设置 Artifact owner-only authorization 选项,以便只有所有者或管理员可以修改工件,则此功能很有用。如果所有者用户离开了机构或所有者帐户,则可能需要更改所有者。或者,如果您只需要将修改授权转换到新用户。
只有在部署 Apicurio Registry 时启用了身份验证时,才会显示 Artifact owner-only authorization 设置和工件 Owner 字段。如需了解更多详细信息,请参阅
在 OpenShift 上安装并部署红帽构建的 Apicurio Registry。
先决条件
- 部署 Apicurio Registry 并创建了工件。
以工件的当前所有者或管理员身份登录到 Apicurio Registry web 控制台:
http://MY_REGISTRY_UI_URL/
流程
- 在 Explore 选项卡中,浏览存储在 Apicurio Registry 中的工件列表,或者输入搜索字符串来查找工件。您可以从列表中选择按条件进行搜索,如名称、组、标签或全局 ID。
- 点击您要重新分配的工件。
- 在 Overview 部分中,点 Owner 字段旁边的铅笔图标。
- 在 New owner 字段中,选择或输入帐户名称。
- 单击更改所有者。
3.5. 使用 Web 控制台配置 Apicurio Registry 设置 复制链接链接已复制到粘贴板!
作为管理员,您可以使用 Apicurio Registry web 控制台在运行时为 Apicurio Registry 配置动态设置。您可以管理身份验证、授权和 API 兼容性等功能的配置选项。
只有在部署了 Apicurio Registry 时启用了身份验证时,才会在 web 控制台中显示身份验证和授权设置。如需了解更多详细信息,请参阅在 OpenShift 上安装和部署红帽构建的 Apicurio Registry。
先决条件
- Apicurio Registry 已部署。
您使用管理员访问权限登录到 Apicurio Registry web 控制台:
http://MY_REGISTRY_UI_URL/
流程
- 在 Apicurio Registry web 控制台中点 Settings 选项卡。
选择您要为 Apicurio Registry 配置的设置:
Expand 表 3.1. 身份验证设置 设置 描述 HTTP 基本身份验证
仅在启用了身份验证时显示(确保部署)。选择后,Apicurio Registry 用户可以使用 HTTP 基本身份验证进行身份验证,除了 OAuth 之外。默认不选择。
Expand 表 3.2. 授权设置 设置 描述 匿名读取访问
仅在启用了身份验证时显示。选择后,Apicurio Registry 授予对匿名用户的只读访问权限,而无需任何凭证。如果要使用 Apicurio Registry 在外部发布模式或 API,则此设置很有用。默认不选择。
工件仅所有者授权
仅在启用了身份验证时显示。选择后,只有创建工件的用户才能修改该工件。默认不选择。
工件组所有者授权
仅在启用了身份验证并且启用了 Artifact owner-only 授权 时显示。选择后,只有创建工件组的用户才能对该工件组具有写入访问权限,例如,在该组中添加或删除工件。默认不选择。
验证的读取访问权限
仅在启用了身份验证时显示。选择后,Apicurio Registry 至少授予来自任何经过身份验证的用户的只读访问权限,而不考虑其用户角色。默认不选择。
Expand 表 3.3. 兼容性设置 设置 描述 规范哈希模式(兼容性 API)
选择后,Schema Registry 兼容性 API 使用规范哈希而不是内容的常规哈希。
传统 ID 模式(兼容性 API)
选择后,Confluent Schema Registry 兼容性 API 使用
globalId而不是contentId作为工件标识符。返回的最大主题数(兼容性 API)
决定 Confluent Schema Registry 兼容性 API 返回的最大 Subject 数量(用于
/subjects端点)。Expand 表 3.4. Web 控制台设置 设置 描述 下载链接到期
为了安全起见,生成到
.zip下载文件的链接的秒数,例如从 Apicurio Registry 导出工件数据时。默认值为 30 秒。Expand 表 3.5. 语义版本设置 设置 描述 自动创建 semver 分支
启用后,自动为主('A.x')和次('A.B.x')工件版本自动创建或更新分支。
确保所有版本号都兼容"semver"
启用后,验证所有工件版本是否都符合 Semantic Versioning 2 格式(https://semver.org)。
Expand 表 3.6. 其他属性 设置 描述 删除工件
选择后,用户可以使用 Core Registry API 删除 Apicurio Registry 中的工件。默认不选择。
删除工件版本
选择后,用户可以使用 Core Registry API 删除 Apicurio Registry 中的工件版本。默认不选择。
Delete group(删除组)
选择后,用户可以使用 Core Registry API 删除 Apicurio Registry 中的组。默认不选择。
存储只读模式
选择后,Registry 会为写入存储的操作返回错误(此属性除外)。默认情况下不启用。
3.6. 使用 Apicurio Registry web 控制台导出和导入数据 复制链接链接已复制到粘贴板!
作为管理员,您可以使用 Apicurio Registry web 控制台从一个 Apicurio Registry 实例导出数据,并将此数据导入到另一个 Apicurio Registry 实例中。您可以使用此功能在不同实例间轻松迁移数据。
以下示例演示了如何将 .zip 文件中的现有数据从一个 Apicurio Registry 实例导出到另一个实例。Apicurio Registry 实例中包含的所有工件数据都会在 .zip 文件中导出。
先决条件
Apicurio Registry 实例已创建如下:
- 从中导出的源实例至少包含一个 schema 或 API 工件
- 您导入的目标实例为空,以保留唯一 ID
您可以使用管理员访问权限登录到 Apicurio Registry web 控制台:
http://MY_REGISTRY_UI_URL/
流程
- 在源 Apicurio Registry 实例的 web 控制台中,查看 Explore 选项卡。
-
点工具栏中 Create artifact 旁边的附加操作图标(三个垂直点),然后选择 Export all (as .ZIP),将这个 Apicurio Registry 实例的数据导出到
.zip下载文件中。 - 在目标 Apicurio Registry 实例的 web 控制台中,查看 Explore 选项卡。
- 点工具栏中 Create artifact 旁边的附加操作图标(三个垂直点),然后选择 Import from .ZIP。
-
拖放或浏览到您之前导出的
.zip下载文件。 - 单击 Import 并等待导入数据。
第 4 章 使用 REST API 管理 Apicurio Registry 内容 复制链接链接已复制到粘贴板!
客户端应用程序可以使用 Apicurio Registry REST API 操作来管理 Apicurio Registry 中的 schema 和 API 工件,例如在生产环境中部署的 CI/CD 管道中。Core Registry API v3 为存储在 Apicurio Registry 中的工件、版本、元数据和规则提供操作。如需更多信息,请参阅 Apicurio Registry REST API 文档。
本章演示了如何使用 Core Registry API v3 来执行以下任务:
4.1. 使用 Apicurio Registry REST API 命令管理 schema 和 API 工件 复制链接链接已复制到粘贴板!
本节展示了一个简单的基于 curl 的示例,它使用 Core Registry API v3 在 Apicurio Registry 中添加和删除简单的模式工件。
先决条件
- Apicurio Registry 在您的环境中安装并运行。
流程
使用
/groups/{groupId}/artifacts操作向 Apicurio Registry 添加工件。以下示例curl命令为共享价格应用程序添加一个简单的模式工件:$ curl -X POST MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --data-raw '{ "artifactId": "share-price", "artifactType": "AVRO", "firstVersion": { "content": { "content": "{\"type\":\"record\",\"name\":\" p\",\"namespace\":\"com.example\", \"fields\":[{\"name\":\"symbol\",\"type\":\"string\"},{\"name\":\"price\",\"type\":\"string\"}]}", "contentType": "application/json" } } }'-
这个示例添加了一个 Apache Avro 模式工件,工件 ID 为
share-price。如果没有指定唯一的工件 ID,Apicurio Registry 会自动生成一个作为 UUID。 -
MY-REGISTRY-URL是在其上部署 Apicurio Registry 的主机名。例如:my-cluster-service-registry-myproject.example.com。 -
本例在 API 路径中指定
my-group的组 ID。如果没有指定唯一的组 ID,则必须在 API 路径中指定../groups/default。
-
这个示例添加了一个 Apache Avro 模式工件,工件 ID 为
验证响应是否包含预期的 JSON 正文,以确认是否添加了构件。例如:
{"artifact":{"owner":"","createdOn":"2024-09-26T17:24:21Z","modifiedBy":"","modifiedOn":"2024-09-26T17:24:21Z","artifactType":"AVRO","groupId":"my-group","artifactId":"share-price"},"version":{"version":"1","owner":"","createdOn":"2024-09-26T17:24:21Z","artifactType":"AVRO","globalId":2,"state":"ENABLED","groupId":"my-group","contentId":2,"artifactId":"share-price"}}-
添加工件时没有指定 version,因此会自动创建默认版本
1。 -
这是添加到 Apicurio Registry 的第二个工件,因此全局 ID 和内容 ID 的值为
2。
-
添加工件时没有指定 version,因此会自动创建默认版本
使用 API 路径中的工件 ID 从 Apicurio Registry 检索工件版本内容。在本例中,指定的 ID 是
share-price:$ curl -H "Authorization: Bearer $ACCESS_TOKEN" \ MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts/share-price/versions/1/content {"type":"record","name":"price","namespace":"com.example", "fields":[{"name":"symbol","type":"string"},{"name":"price","type":"string"}]}
如果您在使用 Core Registry API v3 添加 schema 和 API 工件时没有指定工件版本号,则 Apicurio Registry 会自动生成版本号。创建新工件时的默认版本为 1。
Apicurio Registry 还支持自定义版本控制,您可以在创建工件或工件版本时指定版本号。指定自定义 version 值会覆盖在创建工件或工件版本时通常会分配的默认版本。然后,您可以在执行需要版本号的 REST API 操作时使用此版本值。
本节展示了一个简单的基于 curl 的示例,它使用 Core Registry API v3 在 Apicurio Registry 中添加和检索自定义 Apache Avro 模式版本。您可以指定自定义版本号来创建工件,或添加工件版本。
先决条件
- Apicurio Registry 在您的环境中安装并运行。
流程
使用
/groups/{groupId}/artifacts操作在 registry 中添加工件版本。以下示例curl命令为共享价格应用程序添加一个简单的工件:$ curl -X POST MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --data-raw '{ "artifactId": "my-share-price", "artifactType": "AVRO", "firstVersion": { "version": "1.1.1", "content": { "content": "{\"type\":\"record\",\"name\":\" p\",\"namespace\":\"com.example\", \"fields\":[{\"name\":\"symbol\",\"type\":\"string\"},{\"name\":\"price\",\"type\":\"string\"}]}", "contentType": "application/json" } } }'-
这个示例添加了一个 Avro 模式工件,工件 ID 为
my-share-price和1.1.1版本。如果没有指定版本,Apicurio Registry 会自动生成默认版本1。 -
MY-REGISTRY-URL是在其上部署 Apicurio Registry 的主机名。例如:my-cluster-service-registry-myproject.example.com。 -
本例在 API 路径中指定
my-group的组 ID。如果没有指定唯一的组 ID,则必须在 API 路径中指定../groups/default。
-
这个示例添加了一个 Avro 模式工件,工件 ID 为
验证响应是否包含预期的 JSON 正文,以确认是否添加了自定义工件版本。例如:
{"artifact":{"owner":"","createdOn":"2024-09-26T17:06:21Z","modifiedBy":"","modifiedOn":"2024-09-26T17:06:21Z","artifactType":"AVRO","groupId":"my-group","artifactId":"my-share-price"},"version":{"version":"1.1.1","owner":"","createdOn":"2024-09-26T17:06:21Z","artifactType":"AVRO","globalId":4,"state":"ENABLED","groupId":"my-group","contentId":4,"artifactId":"my-share-price"}}-
在添加工件时,指定了
1.1.1的自定义版本。 -
这是添加到注册表中的第四个构件,因此全局 ID 和内容 ID 的值为
4。
-
在添加工件时,指定了
使用 API 路径中的工件 ID 和版本从 registry 检索工件内容。在本例中,指定的 ID 是
my-share-price,版本是1.1.1:$ curl -H "Authorization: Bearer $ACCESS_TOKEN" \ MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts/my-share-price/versions/1.1.1/content {"type":"record","name":"price","namespace":"com.example", "fields":[{"name":"symbol","type":"string"},{"name":"price","type":"string"}]}
一些 Apicurio Registry 工件类型可以包含从一个 工件文件到另一个工件的工件引用。您可以通过定义可重复使用的模式或 API 工件来创建效率,然后从工件引用中的多个位置引用它们。
以下工件类型支持工件引用:
- Apache Avro
- Google Protobuf
- JSON 架构
- OpenAPI
- AsyncAPI
本节展示了一个简单的基于 curl 的示例,它使用 Core Registry API v3 添加和检索到 Apicurio Registry 中简单 Avro schema 工件的工件引用。
本例首先创建一个名为 ItemId 的模式工件:
ItemId 模式
{
"namespace":"com.example.common",
"name":"ItemId",
"type":"record",
"fields":[
{
"name":"id",
"type":"int"
}
]
}
然后,本示例创建一个名为 Item 的 schema 工件,其中包含对嵌套 ItemId 工件的引用。
带有嵌套 ItemId 模式的项目模式
{
"namespace":"com.example.common",
"name":"Item",
"type":"record",
"fields":[
{
"name":"itemId",
"type":"com.example.common.ItemId"
}
]
}
前提条件
- Apicurio Registry 在您的环境中安装并运行。
流程
添加
ItemId模式工件,您要使用/groups/{groupId}/artifacts操作创建嵌套工件引用:$ curl -X POST MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --data '{"artifactId":"ItemId","artifactType":"AVRO","firstVersion":{"version":"1.0.0","content":{"content":"{\"namespace\":\"com.example.common\",\"name\":\"ItemId\",\"type\":\"record\",\"fields\":[{\"name\":\"id\",\"type\":\"int\"}]}","contentType":"application/json"}}}'-
这个示例添加了一个 Avro schema 工件,工件 ID 为
ItemId。如果没有指定唯一的工件 ID,Apicurio Registry 会自动生成一个作为 UUID。 -
MY-REGISTRY-URL是在其上部署 Apicurio Registry 的主机名。例如:my-cluster-service-registry-myproject.example.com。 -
本例在 API 路径中指定
my-group的组 ID。如果没有指定唯一的组 ID,则必须在 API 路径中指定../groups/default。
-
这个示例添加了一个 Avro schema 工件,工件 ID 为
验证响应是否包含预期的 JSON 正文,以确认是否添加了构件。例如:
{"artifact":{"owner":"","createdOn":"2024-09-26T16:27:38Z","modifiedBy":"","modifiedOn":"2024-09-26T16:27:38Z","artifactType":"AVRO","groupId":"my-group","artifactId":"ItemId"},"version":{"version":"1.0.0","owner":"","createdOn":"2024-09-26T16:27:38Z","artifactType":"AVRO","globalId":2,"state":"ENABLED","groupId":"my-group","contentId":2,"artifactId":"ItemId"}}添加
Item模式工件,它使用/groups/{groupId}/artifacts操作包含到ItemId模式的工件引用:$ curl -X POST MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --data-raw '{ "artifactId": "Item", "artifactType": "AVRO", "firstVersion": { "version": "1.0.0", "content": { "content": "{\"namespace\":\"com.example.common\",\"name\":\"Item\",\"type\":\"record\",\"fields\":[{\"name\":\"itemId\",\"type\":\"com.example.common.ItemId\"}]}", "contentType": "application/json", "references": [ { "name": "com.example.common.ItemId", "groupId": "my-group", "artifactId": "ItemId", "version": "1.0.0" } ] } } }'-
对于工件引用,您必须指定
application/create.extended+json的自定义内容类型,它将扩展application/json内容类型。
-
对于工件引用,您必须指定
验证响应是否包含预期的 JSON 正文,以确认工件是否已创建有引用。例如:
{"artifact":{"owner":"","createdOn":"2024-09-26T16:28:45Z","modifiedBy":"","modifiedOn":"2024-09-26T16:28:45Z","artifactType":"AVRO","groupId":"my-group","artifactId":"Item"},"version":{"version":"1.0.0","owner":"","createdOn":"2024-09-26T16:28:45Z","artifactType":"AVRO","globalId":3,"state":"ENABLED","groupId":"my-group","contentId":3,"artifactId":"Item"}}通过指定包含引用的工件的协调,从 Apicurio Registry 检索工件引用:
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts/Item/versions/1.0.0/references验证响应是否包含此工件引用的预期 JSON 正文。例如:
[{"groupId":"my-group","artifactId":"ItemId","version":"1.0.0","name":"com.example.common.ItemId"}]
解引用
在某些情况下,带有引用的内容内联内容可能会很有用。对于这样的情况,Core Registry API v3 在 某些操作中支持 reference 参数。
目前,当特定 API 操作中存在参数时,这个支持目前为 Avro, JSON Schema, Protobuf, OpenAPI 和 AsyncAPI 实现了。其他架构类型不支持该参数。
检索 dereferenced (lined) schema 内容:
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" MY-REGISTRY-URL/apis/registry/v3/groups/my-group/artifacts/Item/versions/1.0.0/content?references=DEREFERENCE验证响应是否包含此工件内容的预期 JSON 正文,其中包含内联引用。例如:
{"type":"record","name":"Item","namespace":"com.example.common","fields":[{"name":"itemId","type":{"type":"record","name":"ItemId","fields":[{"name":"id","type":"int"}]}}]}
目前,当 API 操作中指定 dereference 参数时,仅支持 Avro、Protobuf、OpenAPI、AsyncAPI 和 JSON Schema 工件。其它工件类型不支持此参数。
对于 Protobuf 工件,只有在所有模式都属于同一软件包时才支持取消引用内容。
环形依赖项被一些工件类型(如 JSON 架构)允许,但 Apicurio Registry 不支持。
4.4. 使用 Apicurio Registry REST API 命令导出和导入 registry 数据 复制链接链接已复制到粘贴板!
作为管理员,您可以使用 Core Registry API v3 将数据从一个 Apicurio Registry 实例导出数据,并导入到另一个 Apicurio Registry 实例,以便您可以在不同实例之间迁移数据。
本节展示了使用 Core Registry API v3 的简单基于 curl 的示例,以 .zip 格式导出并导入一个 Apicurio Registry 实例的现有数据。Apicurio Registry 实例中包含的所有工件数据都会在 .zip 文件中导出。
先决条件
- Apicurio Registry 在您的环境中安装并运行。
已创建 Apicurio Registry 实例:
- 要从中导出数据的源实例至少包含一个 schema 或 API 工件。
- 要将数据导入的目标实例为空,以保留唯一的 ID。
流程
从现有源 Apicurio Registry 实例导出 Apicurio Registry 数据:
$ curl MY-REGISTRY-URL/apis/registry/v3/admin/export \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --output my-registry-data.zipMY-REGISTRY-URL是在其上部署源 Apicurio Registry 的主机名。例如:my-cluster-source-registry-myproject.example.com。将 registry 数据导入到目标 Apicurio Registry 实例中:
$ curl -X POST "MY-REGISTRY-URL/apis/registry/v3/admin/import" \ -H "Content-Type: application/zip" -H "Authorization: Bearer $ACCESS_TOKEN" \ --data-binary @my-registry-data.zipMY-REGISTRY-URL是部署目标 Apicurio Registry 的主机名。例如:my-cluster-target-registry-myproject.example.com。
第 5 章 使用 Maven 插件管理 Apicurio Registry 内容 复制链接链接已复制到粘贴板!
在开发客户端应用程序时,您可以使用 Apicurio Registry Maven 插件来管理存储在 Apicurio Registry 中的 schema 和 API 工件:
前提条件
- Apicurio Registry 在您的环境中安装并运行。
- 在您的环境中安装并配置了 Apache Maven。
5.1. 使用 Maven 插件添加模式和 API 工件 复制链接链接已复制到粘贴板!
Maven 插件的最常见用例是在构建客户端应用程序期间添加工件。您可以使用 注册 执行目标来实现此目的。
先决条件
- 您已为客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven 文档。
流程
更新 Maven
pom.xml文件,以使用apicurio-registry-maven-plugin注册工件。以下示例显示了注册 Apache Avro 和 GraphQL 模式:<plugin> <groupId>io.apicurio</groupId> <artifactId>apicurio-registry-maven-plugin</artifactId> <version>${apicurio.version}</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>register</goal>1 </goals> <configuration> <registryUrl>MY-REGISTRY-URL/apis/registry/v3</registryUrl>2 <authServerUrl>MY-AUTH-SERVER</authServerUrl> <clientId>MY-CLIENT-ID</clientId> <clientSecret>MY-CLIENT-SECRET</clientSecret>3 <clientScope>MY-CLIENT-SCOPE</clientScope> <artifacts> <artifact> <groupId>TestGroup</groupId>4 <artifactId>FullNameRecord</artifactId> <file>${project.basedir}/src/main/resources/schemas/record.avsc</file> <ifExists>FAIL</ifExists> </artifact> <artifact> <groupId>TestGroup</groupId> <artifactId>ExampleAPI</artifactId>5 <artifactType>GRAPHQL</artifactType> <file>${project.basedir}/src/main/resources/apis/example.graphql</file> <ifExists>FIND_OR_CREATE_VERSION</ifExists> <canonicalize>true</canonicalize> </artifact> </artifacts> </configuration> </execution> </executions> </plugin>-
例如,使用
mvn package命令构建 Maven 项目。
5.2. 使用 Maven 插件下载模式和 API 工件 复制链接链接已复制到粘贴板!
您可以使用 Maven 插件从 Apicurio Registry 下载工件。例如,在从注册的模式生成代码时,这通常很有用。
先决条件
- 您已为客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven 文档。
流程
更新 Maven
pom.xml文件,以使用apicurio-registry-maven-plugin下载工件。以下示例显示了下载 Apache Avro 和 GraphQL 模式。<plugin> <groupId>io.apicurio</groupId> <artifactId>apicurio-registry-maven-plugin</artifactId> <version>${apicurio.version}</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>download</goal>1 </goals> <configuration> <registryUrl>MY-REGISTRY-URL/apis/registry/v3</registryUrl>2 <authServerUrl>MY-AUTH-SERVER</authServerUrl> <clientId>MY-CLIENT-ID</clientId> <clientSecret>MY-CLIENT-SECRET</clientSecret>3 <clientScope>MY-CLIENT-SCOPE</clientScope> <artifacts> <artifact> <groupId>TestGroup</groupId>4 <artifactId>FullNameRecord</artifactId>5 <file>${project.build.directory}/classes/record.avsc</file> <overwrite>true</overwrite> </artifact> <artifact> <groupId>TestGroup</groupId> <artifactId>ExampleAPI</artifactId> <version>1</version> <file>${project.build.directory}/classes/example.graphql</file> <overwrite>true</overwrite> </artifact> </artifacts> </configuration> </execution> </executions> </plugin>-
例如,使用
mvn package命令构建 Maven 项目。
5.3. 使用 Maven 插件测试模式和 API 工件 复制链接链接已复制到粘贴板!
您可能想要验证工件是否可以注册,而无需实际进行任何更改。当在 Apicurio Registry 中配置规则时,这通常很有用。如果工件内容违反了任何配置的规则,测试工件会导致失败。
当使用 Maven 插件测试工件时,即使工件通过测试,也不会将内容添加到 Apicurio Registry。
前提条件
- 您已为客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven 文档。
流程
更新 Maven
pom.xml文件,以使用apicurio-registry-maven-plugin来测试工件。以下示例显示了测试 Apache Avro 模式:<plugin> <groupId>io.apicurio</groupId> <artifactId>apicurio-registry-maven-plugin</artifactId> <version>${apicurio.version}</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>test-update</goal>1 </goals> <configuration> <registryUrl>MY-REGISTRY-URL/apis/registry/v3</registryUrl>2 <authServerUrl>MY-AUTH-SERVER</authServerUrl> <clientId>MY-CLIENT-ID</clientId> <clientSecret>MY-CLIENT-SECRET</clientSecret>3 <clientScope>MY-CLIENT-SCOPE</clientScope> <artifacts> <artifact> <groupId>TestGroup</groupId>4 <artifactId>FullNameRecord</artifactId> <file>${project.basedir}/src/main/resources/schemas/record.avsc</file>5 </artifact> </artifacts> </configuration> </execution> </executions> </plugin>-
例如,使用
mvn package命令构建 Maven 项目。
5.4. 使用 Apicurio Registry Maven 插件手动添加工件引用 复制链接链接已复制到粘贴板!
一些 Apicurio Registry 工件类型可以包含从一个 工件文件到另一个工件的工件引用。您可以通过定义可重复使用的模式或 API 工件来创建效率,然后从工件引用中的多个位置引用它们。
以下工件类型支持工件引用:
- Apache Avro
- Google Protobuf
- JSON 架构
- OpenAPI
- AsyncAPI
本节演示了使用 Apicurio Registry Maven 插件手动注册工件引用到 Apicurio Registry 中存储的简单 Avro 模式工件的简单示例。本例假定 Apicurio Registry 中已创建了以下 Exchange 模式工件:
Exchange 模式
{
"namespace": "com.kubetrade.schema.common",
"type": "enum",
"name": "Exchange",
"symbols" : ["GEMINI"]
}
然后,创建一个 TradeKey 模式工件,其中包含对嵌套的 Exchange 模式工件的引用:
带有对 Exchange schema 的嵌套引用的 TradeKey 模式
{
"namespace": "com.kubetrade.schema.trade",
"type": "record",
"name": "TradeKey",
"fields": [
{
"name": "exchange",
"type": "com.kubetrade.schema.common.Exchange"
},
{
"name": "key",
"type": "string"
}
]
}
先决条件
- 您已为客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven 文档。
-
引用的
Exchange模式工件已在 Apicurio Registry 中创建。
流程
更新 Maven
pom.xml文件,以使用apicurio-registry-maven-plugin注册TradeKey模式,其中包含对Exchangeschema 的嵌套引用,如下所示:<plugin> <groupId>io.apicurio</groupId> <artifactId>apicurio-registry-maven-plugin</artifactId> <version>${apicurio-registry.version}</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>register</goal>1 </goals> <configuration> <registryUrl>MY-REGISTRY-URL/apis/registry/v3</registryUrl>2 <authServerUrl>MY-AUTH-SERVER</authServerUrl> <clientId>MY-CLIENT-ID</clientId> <clientSecret>MY-CLIENT-SECRET</clientSecret>3 <clientScope>MY-CLIENT-SCOPE</clientScope> <artifacts> <artifact> <groupId>test-group</groupId>4 <artifactId>TradeKey</artifactId> <version>2.0</version> <artifactType>AVRO</artifactType> <file> ${project.basedir}/src/main/resources/schemas/TradeKey.avsc </file> <ifExists>FIND_OR_CREATE_VERSION</ifExists> <canonicalize>true</canonicalize> <references> <reference>5 <name>com.kubetrade.schema.common.Exchange</name> <groupId>test-group</groupId> <artifactId>Exchange</artifactId> <version>2.0</version> <artifactType>AVRO</artifactType> <file> ${project.basedir}/src/main/resources/schemas/Exchange.avsc </file> <ifExists>FIND_OR_CREATE_VERSION</ifExists> <canonicalize>true</canonicalize> </reference> </references> </artifact> </artifacts> </configuration> </execution> </executions> </plugin>-
例如,使用
mvn package命令构建 Maven 项目。
5.5. 使用 Apicurio Registry Maven 插件自动添加工件引用 复制链接链接已复制到粘贴板!
一些 Apicurio Registry 工件类型可以包含从一个 工件文件到另一个工件的工件引用。您可以通过定义可重复使用的模式或 API 工件来创建效率,然后从工件引用中的多个位置引用它们。
以下工件类型支持工件引用:
- Apache Avro
- Google Protobuf
- JSON 架构
- OpenAPI
- AsyncAPI
您可以指定单个工件并配置 Apicurio Registry Maven 插件,以自动检测同一目录中所有对工件的引用,并自动注册这些引用。这是一个技术预览功能。
红帽产品服务等级协议(SLA)不支持技术预览功能,且功能可能并不完善。红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
本节展示了使用 Maven 插件注册 Avro 模式的简单示例,并自动检测并注册到简单 schema 工件的工件引用。本例假定同一目录中都提供了父 TradeKey 工件和嵌套的 Exchange 模式工件:
带有对 Exchange schema 的嵌套引用的 TradeKey 模式
{
"namespace": "com.kubetrade.schema.trade",
"type": "record",
"name": "TradeKey",
"fields": [
{
"name": "exchange",
"type": "com.kubetrade.schema.common.Exchange"
},
{
"name": "key",
"type": "string"
}
]
}
Exchange 模式
{
"namespace": "com.kubetrade.schema.common",
"type": "enum",
"name": "Exchange",
"symbols" : ["GEMINI"]
}
先决条件
- 您已为客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven 文档。
-
TradeKey模式工件和嵌套的Exchangeschema 工件文件都位于同一目录中。
流程
更新 Maven
pom.xml文件,以使用apicurio-registry-maven-plugin注册TradeKey模式,其中包含对Exchangeschema 的嵌套引用,如下所示:<plugin> <groupId>io.apicurio</groupId> <artifactId>apicurio-registry-maven-plugin</artifactId> <version>${apicurio-registry.version}</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>register</goal>1 </goals> <configuration> <registryUrl>MY-REGISTRY-URL/apis/registry/v3</registryUrl>2 <authServerUrl>MY-AUTH-SERVER</authServerUrl> <clientId>MY-CLIENT-ID</clientId> <clientSecret>MY-CLIENT-SECRET</clientSecret>3 <clientScope>MY-CLIENT-SCOPE</clientScope> <artifacts> <artifact> <groupId>test-group</groupId>4 <artifactId>TradeKey</artifactId> <version>2.0</version> <artifactType>AVRO</artifactType> <file> ${project.basedir}/src/main/resources/schemas/TradeKey.avsc5 </file> <ifExists>FIND_OR_CREATE_VERSION</ifExists> <canonicalize>true</canonicalize> <autoRefs>true</autoRefs>6 </artifact> </artifacts> </configuration> </execution> </executions> </plugin>-
例如,使用
mvn package命令构建 Maven 项目。
第 6 章 使用 SDK 管理 Apicurio Registry 内容 复制链接链接已复制到粘贴板!
您可以编写 Apicurio Registry 客户端应用程序(在 Java、Typescript、Python 或 Golang 中),并使用它来管理存储在 Apicurio Registry 中的工件:
6.1. Apicurio Registry SDK 复制链接链接已复制到粘贴板!
您可以使用其中一个提供的 SDK 来管理存储在 Apicurio Registry 中的工件。您可以执行 REST API 支持的任何所需操作,包括创建、读取、更新或删除工件。您甚至可以使用 Apicurio Registry SDKs 执行管理员功能,如管理全局规则或导入和导出 Apicurio Registry 数据。
您可以使用提供的以下 SDK 作为 Apicurio Registry 的一部分:
- Java
- TypeScript
- Python
- Golang
6.1.1. Java 复制链接链接已复制到粘贴板!
您可以通过在 Apache Maven 项目中添加正确的依赖项来访问 Apicurio Registry Java SDK。如需了解更多详细信息,请参阅 第 6.2 节 “编写 Apicurio Registry SDK 应用程序”。
Apicurio Registry 客户端使用 JDK 提供的 HTTP 客户端实现,您可以根据需要自定义该客户端。例如,您可以添加自定义标头或启用传输层安全(TLS)身份验证的配置选项。如需了解更多详细信息,请参阅 第 6.3 节 “Apicurio Registry Java SDK 配置”。
6.1.2. TypeScript 复制链接链接已复制到粘贴板!
您可以通过向应用程序的 package.json 文件(假设 node.js 应用程序)添加正确的依赖项来访问 Apicurio Registry Typescript SDK:
https://www.npmjs.com/package/@apicurio/apicurio-registry-sdk
6.1.3. Python 复制链接链接已复制到粘贴板!
您可以通过在 python 项目中添加正确的依赖项来访问 Apicurio Registry Python SDK (假设您使用 pypi):
6.1.4. Golang 复制链接链接已复制到粘贴板!
您可以通过在项目中添加正确的依赖项来访问 Apicurio Registry Golang SDK:
https://github.com/Apicurio/apicurio-registry/tree/main/go-sdk
6.2. 编写 Apicurio Registry SDK 应用程序 复制链接链接已复制到粘贴板!
您可以使用 Apicurio Registry SDK 之一编写客户端应用程序来管理 Apicurio Registry 中存储的工件。
6.2.1. 使用 Apicurio Registry Java SDK 复制链接链接已复制到粘贴板!
先决条件
- Apicurio Registry 在您的环境中安装并运行。
- 您已为 Java 客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven。
流程
在 Maven 项目中添加以下依赖项:
<dependency> <groupId>io.apicurio</groupId> <artifactId>apicurio-registry-java-sdk</artifactId> <version>${apicurio-registry.version}</version> </dependency>创建 Apicurio Registry 客户端,如下所示:
import io.vertx.core.Vertx;public class ClientExample { public static void main(String[] args) throws Exception { // Create a registry client String registryUrl = "https://my-registry.my-domain.com/apis/registry/v3";1 Vertx vertx = Vertx.vertx();2 VertXRequestAdapter vertXRequestAdapter = new VertXRequestAdapter(vertx); vertXRequestAdapter.setBaseUrl(REGISTRY_URL); RegistryClient client = new RegistryClient(vertXRequestAdapter);3 // Use client here vertx.close();4 } }
创建客户端时,您可以使用客户端中的 Apicurio Registry REST API 中所有可用的操作。如需了解更多详细信息,请参阅 Apicurio Registry REST API 文档。
6.3. Apicurio Registry Java SDK 配置 复制链接链接已复制到粘贴板!
Apicurio Registry Java 客户端根据客户端工厂包括以下配置选项:
| 选项 | 描述 | 参数 |
|---|---|---|
| 普通客户端 | 用于与正在运行的 Apicurio Registry 交互的基本 REST 客户端。 |
|
| 带有自定义配置的客户端 | 使用用户提供的配置 Apicurio Registry 客户端。 |
|
| 带有自定义配置和身份验证的客户端 | Apicurio Registry 客户端接受包含自定义配置的映射。例如,这对向调用添加自定义标头非常有用。您还必须提供身份验证服务器来验证请求。 |
|
自定义标头配置
要配置自定义标头,您必须将 apicurio.registry.request.headers 前缀添加到 configs map 键中。例如,配置映射键为 apicurio.registry.request.headers.Authorization,值为 Basic: YWxhZGRpbjpvcGVuc2VzYW1,将 Authorization 标头设置为相同的值。
TLS 配置选项
您可以使用以下属性为 Apicurio Registry Java 客户端配置传输层安全(TLS)身份验证:
-
apicurio.registry.request.ssl.truststore.location -
apicurio.registry.request.ssl.truststore.password -
apicurio.registry.request.ssl.truststore.type -
apicurio.registry.request.ssl.keystore.location -
apicurio.registry.request.ssl.keystore.password -
apicurio.registry.request.ssl.keystore.type -
apicurio.registry.request.ssl.key.password
第 7 章 在 Java 客户端中使用序列化器/反序列化器验证 Kafka 信息 复制链接链接已复制到粘贴板!
Apicurio Registry 为使用 Java 编写的 Kafka 生成者和消费者应用程序提供客户端序列化器/反序列化器(SerDes)。Kafka 制作者应用程序使用 serializers 对符合特定事件模式的信息进行编码。Kafka 消费者应用程序使用 deserializers 来验证信息是否使用正确的模式序列化,具体取决于特定的模式 ID。这样可确保使用一致的模式,并有助于防止运行时的数据错误。
本章解释了如何在生成者和消费者客户端应用程序中使用 Kafka 客户端 SerDe :
先决条件
- 您已阅了读 第 1 章 Apicurio Registry 简介。
- 已安装 Apicurio Registry。
您已创建了 Kafka producer 和消费者客户端应用程序。
有关 Kafka 客户端应用程序的详情,请参阅在 OpenShift 中部署和管理 AMQ Streams。
7.1. Kafka 客户端应用程序和 Apicurio Registry 复制链接链接已复制到粘贴板!
Apicurio Registry 将模式管理与客户端应用程序配置分离。您可以通过在客户端代码中指定 URL 来启用 Java 客户端应用程序以使用 Apicurio Registry 中的模式。
您可以将 schema 存储在 Apicurio Registry 中,以序列化和反序列化消息,这些消息从客户端应用程序引用,以确保它们发送和接收的消息与这些模式兼容。Kafka 客户端应用程序可以在运行时从 Apicurio Registry 中推送或拉取其模式。
模式可以演进,以便在 Apicurio Registry 中定义规则,例如,确保 schema 更改有效,且不会破坏应用程序使用以前的版本。Apicurio Registry 通过将修改的模式与以前的模式进行比较来检查兼容性。
Apicurio Registry 模式技术
Apicurio Registry 为模式技术提供模式 registry 支持,例如:
- Avro
- protobuf
- JSON 架构
这些模式技术可通过 Apicurio Registry 提供的 Kafka 客户端序列化/反序列化器(SerDes)服务使用。Apicurio Registry 提供的 SerDes 类的成熟度和使用可能不同。以下章节详细介绍了每种模式类型。
producer 模式配置
制作者客户端应用程序使用序列化器将发送到特定代理主题的消息放入正确的数据格式。
启用制作者以使用 Apicurio Registry 进行序列化:
- 使用 Apicurio Registry 定义并注册您的 schema (如果它尚不存在)。
使用以下命令配置制作者 客户端代码:
- Apicurio Registry 的 URL
- Apicurio Registry serializer 用于消息
- 将 Kafka 消息映射到 Apicurio Registry 中的模式工件的策略
- 在 Apicurio Registry 中查找或注册用于序列化的模式的策略
注册 schema 后,当您启动 Kafka 和 Apicurio Registry 时,您可以访问 schema 来格式化发送到 Kafka 代理主题的信息。或者,根据配置,生成者也可以在首次使用时自动注册模式。
如果 schema 已存在,您可以根据 Apicurio Registry 中定义的兼容性规则使用 registry REST API 创建新版本。随着模式的演进,版本用于兼容性检查。组 ID、工件 ID 和版本代表用于标识模式的唯一元组。
consumer 模式配置
消费者客户端应用程序使用反序列化器将来自特定代理主题使用的消息提取到正确的数据格式。
启用消费者以使用 Apicurio Registry 进行反序列化:
- 使用 Apicurio Registry 定义并注册您的 schema (如果不存在)
- Apicurio Registry 的 URL
- 用于消息的 Apicurio Registry deserializer
- 用于序列化的输入数据流
使用内容 ID 检索模式
默认情况下,模式使用内容 ID 从 Apicurio Registry 检索(这是对工件版本 内容 的唯一 ID,但不对版本本身是唯一的),它在被消耗的消息中指定。架构内容 ID 可以位于消息标头或消息有效负载中,具体取决于制作者应用的配置。默认情况下,内容 ID 将位于消息正文中。
在消息有效负载中查找内容 ID 时,数据的格式以 magic 字节开头,用作消费者的信号,后跟内容 ID,以及消息数据。例如:
# ...
[MAGIC_BYTE]
[CONTENT_ID]
[MESSAGE DATA]
然后,当您启动 Kafka 和 Apicurio Registry 时,您可以访问 schema 来格式化从 Kafka 代理主题收到的消息。
使用全局 ID 检索模式
或者,您可以将 配置为根据全局 ID 从 Apicurio Registry 检索模式,这是工件版本的唯一 ID。使用全局 ID 而不是 contentID 时,可以使用相同的选项。您可以在消息标头或消息正文(默认)中发送全局 ID。
在消息有效负载中查找全局 ID 时,数据的格式以魔法字节开头,用作消费者的信号,后跟全局 ID,以及消息数据正常。例如:
# ...
[MAGIC_BYTE]
[GLOBAL_ID]
[MESSAGE DATA]
7.2. 在 Apicurio Registry 中查找模式的策略 复制链接链接已复制到粘贴板!
Kafka 客户端 serializer 使用 lookup 策略来 决定在 Apicurio Registry 中注册消息 schema 的工件 ID 和全局 ID。对于给定主题和消息,您可以使用 ArtifactReferenceResolverStrategy Java 接口的不同实现来返回对 registry 中的工件的引用。
每个策略的类位于 io.apicurio.registry.serde.strategy 软件包中。Avro SerDes 的特定策略类位于 io.apicurio.registry.serde.avro.strategy 软件包中。默认策略是 TopicIdStrategy,它查找与 Kafka 主题接收信息相同的 Apicurio Registry 工件。
Example
public ArtifactReference artifactReference(String topic, boolean isKey, T schema) {
return ArtifactReference.builder()
.groupId(null)
.artifactId(String.format("%s-%s", topic, isKey ? "key" : "value"))
.build();
-
topic参数是接收消息的 Kafka 主题的名称。 -
当消息键被序列化时,
isKey参数为true,当消息值被序列化时为false。 -
schema参数是消息序列化或反序列化的模式。 -
返回的
ArtifactReference包含在其中注册 schema 的工件 ID。
您使用的查找策略取决于您如何和存储架构的位置。例如,如果您有具有相同 Avro 消息类型的不同 Kafka 主题,您可以使用一个使用 记录 ID 的策略。
工件解析器策略
工件解析器策略提供了一种将 Kafka 主题和消息信息映射到 Apicurio Registry 中的工件的方法。映射的常见约定是将 Kafka 主题名称与 键或 值 组合,具体取决于 serializer 是否用于 Kafka 消息键或值。
但是,您可以使用 Apicurio Registry 提供的策略或创建一个实现 io.apicurio.registry.serde.strategy.ArtifactReferenceResolverStrategy 的自定义 Java 类,为映射使用替代约定。
返回工件引用的策略
Apicurio Registry 提供以下策略,以根据 ArtifactReferenceResolverStrategy 的实现返回对工件的引用:
RecordIdStrategy- 使用模式全名的 avro 特定策略。
TopicRecordIdStrategy- avro 特定的策略,它使用主题名称和架构的完整名称。
TopicIdStrategy-
默认策略,它使用主题名和
key或value后缀。 SimpleTopicIdStrategy- 仅使用主题名称的简单策略。
DefaultSchemaResolver interface
默认架构解析器会查找并标识在由工件解析器策略提供的工件引用下注册的 schema 的特定版本。每个工件的每个版本都有一个全局唯一标识符,可用于检索该工件的内容。这个全局 ID 都包含在每个 Kafka 消息中,以便 deserializer 可以从 Apicurio Registry 正确获取 schema。
默认架构解析器可以查找现有工件版本,如果未找到,则可以注册一个,具体取决于使用了哪个策略。您还可以通过创建一个实现 io.apicurio.registry.resolver.SchemaResolver 的自定义 Java 类来提供自己的策略。但是,建议使用 DefaultSchemaResolver 并指定配置属性。
配置 registry 查找选项
使用 DefaultSchemaResolver 时,您可以使用应用属性配置其行为。下表显示了一些常用的示例:
| 属性 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
|
| 指定序列化器是否尝试为对应的组 ID 和工件 ID 在 registry 中查找最新的工件。 |
|
|
|
| 指示序列化器将指定的 ID 写入 Kafka,并指示反序列化器使用这个 ID 来查找 schema。 | None |
|
|
| 指定序列化器是否在 registry 中创建工件。JSON 架构序列化器不支持它。 |
|
|
|
| 指定缓存全局 ID 的时间(以毫秒为单位)。如果没有配置,则每次都会获取全局 ID。 | None |
7.3. 在 Apicurio Registry 中注册模式 复制链接链接已复制到粘贴板!
以适当的格式(如 Apache Avro)定义了模式后,您可以将 schema 添加到 Apicurio Registry。
您可以使用以下方法添加模式:
- Apicurio Registry web 控制台
- 使用 Apicurio Registry REST API 的 curl 命令
- Apicurio Registry 提供的 Maven 插件
- 添加到客户端代码的 schema 配置
在注册了 schema 前,客户端应用程序无法使用 Apicurio Registry。
Apicurio Registry web 控制台
安装 Apicurio Registry 时,您可以从 ui 端点连接到 Web 控制台:
http://MY-REGISTRY-URL/ui
在控制台中,您可以添加、查看和配置架构。您还可以创建阻止添加到 registry 中的无效内容的规则。
curl 命令示例
curl -X POST -H "Content-type: application/json; artifactType=AVRO" \
-H "X-Registry-ArtifactId: share-price" \
--data '{
"type":"record",
"name":"price",
"namespace":"com.example",
"fields":[{"name":"symbol","type":"string"},
{"name":"price","type":"string"}]}'
https://my-cluster-my-registry-my-project.example.com/apis/registry/v3/groups/my-group/artifacts -s
Maven 插件示例
<plugin>
<groupId>io.apicurio</groupId>
<artifactId>apicurio-registry-maven-plugin</artifactId>
<version>${apicurio.version}</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>register</goal>
</goals>
<configuration>
<registryUrl>http://REGISTRY-URL/apis/registry/v3</registryUrl>
<artifacts>
<artifact>
<groupId>TestGroup</groupId>
<artifactId>FullNameRecord</artifactId>
<file>${project.basedir}/src/main/resources/schemas/record.avsc</file>
<ifExists>FAIL</ifExists>
</artifact>
<artifact>
<groupId>TestGroup</groupId>
<artifactId>ExampleAPI</artifactId>
<artifactType>GRAPHQL</artifactType>
<file>${project.basedir}/src/main/resources/apis/example.graphql</file>
<ifExists>FIND_OR_CREATE_VERSION</ifExists>
<canonicalize>true</canonicalize>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
7.4. 使用 Kafka 消费者客户端中的模式 复制链接链接已复制到粘贴板!
此流程描述了如何配置使用 Java 编写的 Kafka 消费者客户端,以使用 Apicurio Registry 中的模式。
前提条件
- 已安装 Apicurio Registry
- 模式在 Apicurio Registry 中注册
流程
使用 Apicurio Registry 的 URL 配置客户端。例如:
String registryUrl = "https://registry.example.com/apis/registry/v3"; Properties props = new Properties(); props.putIfAbsent(SerdeConfig.REGISTRY_URL, registryUrl);使用 Apicurio Registry deserializer 配置客户端。例如:
// Configure Kafka settings props.putIfAbsent(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, SERVERS); props.putIfAbsent(ConsumerConfig.GROUP_ID_CONFIG, "Consumer-" + TOPIC_NAME); props.putIfAbsent(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true"); props.putIfAbsent(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000"); props.putIfAbsent(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); // Configure deserializer settings props.putIfAbsent(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, AvroKafkaDeserializer.class.getName());1 props.putIfAbsent(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, AvroKafkaDeserializer.class.getName());2
7.5. 从 Kafka producer 客户端使用模式 复制链接链接已复制到粘贴板!
此流程描述了如何配置使用 Java 编写的 Kafka producer 客户端,以使用 Apicurio Registry 中的模式。
前提条件
- 已安装 Apicurio Registry
- 模式在 Apicurio Registry 中注册
流程
使用 Apicurio Registry 的 URL 配置客户端。例如:
String registryUrl = "https://registry.example.com/apis/registry/v3"; Properties props = new Properties(); props.putIfAbsent(SerdeConfig.REGISTRY_URL, registryUrl);使用 serializer 配置客户端,并使用策略在 Apicurio Registry 中查找 schema。例如:
props.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, "my-cluster-kafka-bootstrap:9092"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, AvroKafkaSerializer.class.getName());1 props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AvroKafkaSerializer.class.getName());2 props.put(SerdeConfig.FIND_LATEST_ARTIFACT, Boolean.TRUE);3
7.6. 使用 Kafka Streams 应用程序中的模式 复制链接链接已复制到粘贴板!
此流程描述了如何配置使用 Java 编写的 Kafka Streams 客户端,以使用 Apicurio Registry 中的 Apache Avro 模式。
前提条件
- 已安装 Apicurio Registry
- 模式在 Apicurio Registry 中注册
流程
使用 Apicurio Registry URL 创建和配置 Java 客户端:
String registryUrl = "https://registry.example.com/apis/registry/v3"; RegistryService client = RegistryClient.cached(registryUrl);配置 serializer 和 deserializer:
Serializer<LogInput> serializer = new AvroKafkaSerializer<LogInput>();1 Deserializer<LogInput> deserializer = new AvroKafkaDeserializer <LogInput>();2 Serde<LogInput> logSerde = Serdes.serdeFrom( serializer, deserializer ); Map<String, Object> config = new HashMap<>(); config.put(SerdeConfig.REGISTRY_URL, registryUrl); config.put(AvroSerdeConfig.USE_SPECIFIC_AVRO_READER, true); logSerde.configure(config, false);3 创建 Kafka Streams 客户端:
KStream<String, LogInput> input = builder.stream( INPUT_TOPIC, Consumed.with(Serdes.String(), logSerde) );
第 8 章 在 Java 客户端中配置 Kafka 序列化器/反序列化器 复制链接链接已复制到粘贴板!
本章详细介绍了如何在生产者和消费者 Java 客户端应用程序中配置 Kafka 序列化器/反序列化器(SerDes):
- 第 8.1 节 “客户端应用程序中的 Apicurio Registry serializer/deserializer 配置”
- 第 8.2 节 “Apicurio Registry serializer/deserializer 配置属性”
- 第 8.3 节 “如何配置不同的客户端序列化器/反序列化器类型”
- 第 8.3.1 节 “使用 Apicurio Registry 配置 Avro SerDe”
- 第 8.3.2 节 “使用 Apicurio Registry 配置 JSON 架构 SerDe”
- 第 8.3.3 节 “使用 Apicurio Registry 配置 Protobuf SerDe”
先决条件
您可以使用本节中显示的示例常量直接在客户端应用程序中配置特定的客户端序列化/反序列化器/反序列化器(SerDes)服务和模式查找策略。
以下小节演示了常用的 SerDes 常量和配置选项示例。
配置 SerDes 服务
public class SerdeConfig {
public static final String REGISTRY_URL = "apicurio.registry.url";
public static final String ID_HANDLER = "apicurio.registry.id-handler";
- Apicurio Registry 所需的 URL。
-
扩展 ID 处理以支持其他 ID 格式,并使其与 Apicurio Registry SerDes 服务兼容。例如,您可以将它从与 Confluent 的 ID 格式兼容的默认 ID 格式改为
Long。
配置 SerDes 查找策略
public class SerdeConfig {
public static final String ARTIFACT_RESOLVER_STRATEGY = "apicurio.registry.artifact-resolver-strategy";
public static final String SCHEMA_RESOLVER = "apicurio.registry.schema-resolver";
...
配置 Kafka 转换器
public class SerdeBasedConverter<S, T> extends SchemaResolverConfigurer<S, T> implements Converter, Closeable {
public static final String REGISTRY_CONVERTER_SERIALIZER_PARAM = "apicurio.registry.converter.serializer";
public static final String REGISTRY_CONVERTER_DESERIALIZER_PARAM = "apicurio.registry.converter.deserializer";
- 与 Apicurio Registry Kafka 转换程序搭配使用所需的 serializer。
- 与 Apicurio Registry Kafka converter 搭配使用所需的 deserializer。
配置不同的模式类型
有关如何为不同的模式技术配置 SerDe 的详情,请参考以下内容:
8.2. Apicurio Registry serializer/deserializer 配置属性 复制链接链接已复制到粘贴板!
本节提供有关 Apicurio Registry Kafka serializers/deserializers (SerDes)的 Java 配置属性的参考信息。
SchemaResolver 接口
Apicurio Registry SerDes 基于 SchemaResolver 接口,它抽象访问 registry,并为所有受支持格式的 SerDes 类应用相同的查找逻辑。
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
|
由序列化器和反序列化器使用。实现 | 字符串 |
|
建议使用 DefaultSchemaResolver,为大多数用例提供有用的功能。对于一些高级用例,您可以使用 SchemaResolver 的自定义实现。
DefaultSchemaResolver class
您可以使用 DefaultSchemaResolver 来配置功能,例如:
- 访问 registry API
- 如何在 registry 中查找工件
- 如何为 Kafka 编写和读取工件信息
- deserializers 的回退选项
配置 registry API 访问选项
DefaultSchemaResolver 提供以下属性来配置对核心 registry API 的访问:
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
| 由序列化器和反序列化器使用。用于访问 registry API 的 URL。 |
| None |
|
|
| 由序列化器和反序列化器使用。令牌端点的 URL。 |
| None |
|
|
| 由序列化器和反序列化器使用。用于访问身份验证服务的客户端 ID。在使用 OAuth 客户端凭证流访问安全 registry 时需要此项。 |
| None |
|
|
| 由序列化器和反序列化器使用。用于访问身份验证服务的客户端机密。在使用 OAuth 客户端凭证流访问安全 registry 时需要此项。 |
| None |
|
|
| 由序列化器和反序列化器使用。用于访问 registry 的用户名。使用 HTTP 基本身份验证访问安全 registry 时需要此项。 |
| None |
|
|
| 由序列化器和反序列化器使用。访问 registry 的密码。使用 HTTP 基本身份验证访问安全 registry 时需要此项。 |
| None |
配置 registry 查找选项
DefaultSchemaResolver 使用以下属性来配置如何在 Apicurio Registry 中查找工件。
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
|
仅由 serializers 使用。实现 |
|
|
|
|
|
仅由 serializers 使用。设置用于查询或创建工件的 |
| None |
|
|
|
仅由 serializers 使用。设置用于查询或创建工件的 |
| None |
|
|
|
仅由 serializers 使用。设置用于查询或创建工件的工件版本。覆盖 |
| None |
|
|
| 仅由 serializers 使用。指定序列化器是否尝试为对应的组 ID 和工件 ID 在 registry 中查找最新的工件。 |
|
|
|
|
| 仅由 serializers 使用。指定序列化器是否在 registry 中创建工件。JSON 架构序列化器不支持此功能。 |
|
|
|
|
| 用于指示用来解引用模式的语义。这在两个不同的情况下使用,在注册模式后,指示该范围向服务器询问架构被取消引用。它还用来指示序列化器在注册 registry 前解引用模式,但这只支持 Avro。 |
|
|
|
|
|
仅由 serializers 使用。在创建工件时配置客户端的行为,因为工件已存在。可用值包括 |
|
|
|
|
| 由序列化器和反序列化器使用。指定在自动运行前缓存工件的时间(毫秒)。如果设置为零,则每次都会获取工件。 |
|
|
|
|
| 由序列化器和反序列化器使用。如果无法从 Registry 检索架构,它可能会重试次数。此配置选项控制重试尝试之间的延迟(毫秒)。 |
|
|
|
|
| 由序列化器和反序列化器使用。如果无法从 Registry 检索架构,它可能会重试次数。此配置选项控制重试尝试的数量。 |
|
|
|
|
|
由序列化器和反序列化器使用。配置以使用指定的 |
|
|
配置 Kafka 中的读/写 registry 工件
DefaultSchemaResolver 使用以下属性来配置如何写入或从 Kafka 读取工件信息。
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
| 由序列化器和反序列化器使用。配置为将工件标识符读/写到 Kafka 消息标头,而不是在消息有效负载中。 |
|
|
|
|
|
由序列化器和反序列化器使用。实现 |
|
|
|
|
|
由序列化器和反序列化器使用。实施 |
|
|
配置反序列化选项
DefaultSchemaResolver 使用下列属性来为所有反序列化器配置回退提供程序。
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
|
仅限反序列化器使用。设置 |
|
|
DefaultFallbackArtifactProvider 使用以下属性来配置 deserializer fall-back 选项:
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
|
仅限反序列化器使用。设置用于解析用于序列化的工件的 |
| None |
|
|
|
仅限反序列化器使用。设置用于解析用于序列化的组的 |
| None |
|
|
| 仅限反序列化器使用。将用于解析用于序列化的工件的版本设置为回退。 |
| None |
其他资源
- 如需了解更多详细信息,请参阅 SerdeConfig Java 类。
-
您可以将应用程序属性配置为 Java 系统属性,或者将其包含在 Quarkus
application.properties文件中。如需了解更多详细信息,请参阅 Quarkus 文档。
8.3. 如何配置不同的客户端序列化器/反序列化器类型 复制链接链接已复制到粘贴板!
在 Kafka 客户端应用程序中使用模式时,您必须选择要使用的特定模式类型,具体取决于您的用例。Apicurio Registry 为 Apache Avro、JSON Schema 和 Google Protobuf 提供 SerDe Java 类。以下小节解释了如何将 Kafka 应用程序配置为使用每种类型。
您还可以使用 Kafka 实现自定义序列化器和反序列化器类,并使用 Apicurio Registry REST Java 客户端利用 Apicurio Registry 功能。
serializers/deserializers 的 Kafka 应用程序配置
在 Kafka 应用程序中使用 Apicurio Registry 提供的 SerDe 类涉及设置正确的配置属性。以下简单的 Avro 示例演示了如何在 Kafka producer 应用程序中配置序列化器,以及如何在 Kafka 消费者应用程序中配置反序列化器。
Kafka producer 中的序列化器配置示例
// Create the Kafka producer
private static Producer<Object, Object> createKafkaProducer() {
Properties props = new Properties();
// Configure standard Kafka settings
props.putIfAbsent(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, SERVERS);
props.putIfAbsent(ProducerConfig.CLIENT_ID_CONFIG, "Producer-" + TOPIC_NAME);
props.putIfAbsent(ProducerConfig.ACKS_CONFIG, "all");
// Use Apicurio Registry-provided Kafka serializer for Avro
props.putIfAbsent(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
props.putIfAbsent(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AvroKafkaSerializer.class.getName());
// Configure the Apicurio Registry location
props.putIfAbsent(SerdeConfig.REGISTRY_URL, REGISTRY_URL);
// Register the schema artifact if not found in the registry.
props.putIfAbsent(SerdeConfig.AUTO_REGISTER_ARTIFACT, Boolean.TRUE);
// Create the Kafka producer
Producer<Object, Object> producer = new KafkaProducer<>(props);
return producer;
}
Kafka consumer 中的 deserializer 配置示例
// Create the Kafka consumer
private static KafkaConsumer<Long, GenericRecord> createKafkaConsumer() {
Properties props = new Properties();
// Configure standard Kafka settings
props.putIfAbsent(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, SERVERS);
props.putIfAbsent(ConsumerConfig.GROUP_ID_CONFIG, "Consumer-" + TOPIC_NAME);
props.putIfAbsent(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
props.putIfAbsent(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
props.putIfAbsent(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
// Use Apicurio Registry-provided Kafka deserializer for Avro
props.putIfAbsent(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
props.putIfAbsent(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, AvroKafkaDeserializer.class.getName());
// Configure the Apicurio Registry location
props.putIfAbsent(SerdeConfig.REGISTRY_URL, REGISTRY_URL);
// No other configuration needed because the schema globalId the deserializer uses is sent
// in the payload. The deserializer extracts the globalId and uses it to look up the schema
// from the registry.
// Create the Kafka consumer
KafkaConsumer<Long, GenericRecord> consumer = new KafkaConsumer<>(props);
return consumer;
}
8.3.1. 使用 Apicurio Registry 配置 Avro SerDe 复制链接链接已复制到粘贴板!
本主题解释了如何为 Apache Avro 使用 Kafka 客户端序列化器和反序列化器(SerDes)类。
Apicurio Registry 为 Avro 提供以下 Kafka 客户端 SerDes 类:
-
io.apicurio.registry.serde.avro.AvroKafkaSerializer -
io.apicurio.registry.serde.avro.AvroKafkaDeserializer
配置 Avro serializer
您可以使用以下方法配置 Avro serializer 类:
- Apicurio Registry URL
- 工件解析器策略
- ID 位置
- ID 编码
- avro datum 供应商
- avro 编码
ID 位置
serializer 传递模式的唯一 ID 作为 Kafka 消息的一部分,以便使用者可以使用正确的模式来反序列化。ID 可以在消息有效负载或消息标头中。默认位置是消息有效负载。要在消息标头中发送 ID,请设置以下配置属性:
props.putIfAbsent(SerdeConfig.ENABLE_HEADERS, "true")
属性名称为 apicurio.registry.headers.enabled。
ID 编码
您可以在 Kafka 消息正文传递时自定义模式 ID 的编码方式。将 apicurio.registry.id-handler 配置属性设置为实现 io.apicurio.registry.serde.IdHandler 接口的类。Apicurio Registry 提供以下实现:
-
io.apicurio.registry.serde.Default4ByteIdHandler: 将 ID 存储为 4 字节长 -
io.apicurio.registry.serde.Legacy8ByteIdHandler: 将 ID 存储为 8 字节整数
Apicurio Registry 长期代表模式 ID,但出于旧原因,或者出于与其他 registry 或 SerDe 类兼容,您可能需要在发送 ID 时使用 4 字节。
avro datum 供应商
avro 提供不同的 datum 写入器和读者,用于写入和读取数据。Apicurio Registry 支持三种不同类型的类型:
- generic
- 特定
- reflect
Apicurio Registry AvroDatumProvider 是使用类型的抽象,其中 DefaultAvroDatumProvider 被默认使用。
您可以设置以下配置选项:
-
apicurio.registry.avro-datum-provider: 指定AvroDatumProvider实现的完全限定的 Java 类名称,如io.apicurio.registry.serde.avro.ReflectAvroDatumProvider -
apicurio.registry.use-specific-avro-reader: 设置为true,以便在使用DefaultAvroDatumProvider时使用特定类型的
avro 编码
当使用 Avro 序列化数据时,您可以使用 Avro 二进制编码格式来确保数据编码为尽可能有效的格式。avro 还支持将数据编码为 JSON,这有助于检查每个消息的有效负载,例如用于日志记录或调试。
您可以通过将 apicurio.registry.avro.encoding 属性配置为 JSON 或 BINARY来设置 Avro 编码。默认值为 BINARY。
配置 Avro deserializer
您必须配置 Avro deserializer 类,以匹配序列化器的以下配置设置:
- Apicurio Registry URL
- ID 编码
- avro datum 供应商
- avro 编码
有关这些配置选项,请参阅 serializer 部分。属性名称和值是相同的。
配置反序列化器时不需要以下选项:
- 工件解析器策略
- ID 位置
deserializer 类可以从消息中决定这些选项的值。不需要该策略,因为 serializer 负责发送 ID 作为消息的一部分。
ID 位置是通过在消息有效负载开始时检查 magic 字节来确定的。如果找到该字节,则使用配置的处理程序从消息有效负载中读取 ID。如果没有找到 magic 字节,则会从消息标头中读取 ID。
avro SerDes 和工件引用
在使用 Avro 消息和带有嵌套记录的模式时,会为每个嵌套记录注册一个新的工件。例如,以下 TradeKey 模式包括嵌套的 Exchange 模式:
带有嵌套交换模式的 TradeKey 模式
{
"namespace": "com.kubetrade.schema.trade",
"type": "record",
"name": "TradeKey",
"fields": [
{
"name": "exchange",
"type": "com.kubetrade.schema.common.Exchange"
},
{
"name": "key",
"type": "string"
}
]
}
Exchange 模式
{
"namespace": "com.kubetrade.schema.common",
"type": "enum",
"name": "Exchange",
"symbols" : ["GEMINI"]
}
当将这些模式与 Avro SerDes 搭配使用时,会在 Apicurio Registry 中创建两个工件,一个用于 TradeKey 模式,一个用于 Exchange 模式。每当使用 TradeKey 模式的消息被序列化或反序列化时,会检索这两个模式,允许您将定义分成不同的文件中。
8.3.2. 使用 Apicurio Registry 配置 JSON 架构 SerDe 复制链接链接已复制到粘贴板!
本主题解释了如何将 Kafka 客户端序列化器和反序列化器(SerDes)类用于 JSON Schema。
Apicurio Registry 为 JSON Schema 提供以下 Kafka 客户端 SerDes 类:
-
io.apicurio.registry.serde.jsonschema.JsonSchemaKafkaSerializer -
io.apicurio.registry.serde.jsonschema.JsonSchemaKafkaDeserializer
与 Apache Avro 不同,JSON 架构不是序列化技术,而是验证技术。因此,JSON 架构的配置选项略有不同。例如,没有编码选项,因为数据始终编码为 JSON。
配置 JSON 架构序列化器
您可以配置 JSON 架构 serializer 类,如下所示:
- Apicurio Registry URL
- 工件解析器策略
- 模式验证
唯一的非标准配置属性是 JSON Schema 验证,默认是启用的。您可以通过将 apicurio.registry.serde.validation-enabled 设置为 "false" 来禁用此功能。例如:
props.putIfAbsent(SerdeConfig.VALIDATION_ENABLED, Boolean.FALSE)
配置 JSON 架构反序列化器
您可以配置 JSON Schema deserializer 类,如下所示:
- Apicurio Registry URL
- 模式验证
- 用于取消序列化数据的类
您必须提供 Apicurio Registry 的位置,以便可以载入 schema。其他配置是可选的。
只有在序列化器通过 Kafka 消息中的全局 ID 时,反序列化器验证才能正常工作,这只有在 serializer 中启用了验证时才会发生。
JSON 架构 SerDe 和工件引用
JSON Schema SerDes 无法从消息有效负载发现架构,因此必须事先注册 schema 工件,这也应用工件引用。
根据架构的内容,如果 $ref 值是一个 URL,SerDes 会尝试使用该 URL 解析引用的模式,然后验证可以正常工作,根据主模式验证数据,并根据嵌套模式验证嵌套值。还实现了对 Apicurio Registry 中引用工件的支持。
例如,以下对 city .json 模式的引用是 city.json 模式:
带有 city.json schema 的参考信息.json 模式
{
"$id": "https://example.com/citizen.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Citizen",
"type": "object",
"properties": {
"firstName": {
"type": "string",
"description": "The citizen's first name."
},
"lastName": {
"type": "string",
"description": "The citizen's last name."
},
"age": {
"description": "Age in years which must be equal to or greater than zero.",
"type": "integer",
"minimum": 0
},
"city": {
"$ref": "city.json"
}
}
}
city.json schema
{
"$id": "https://example.com/city.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "City",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The city's name."
},
"zipCode": {
"type": "integer",
"description": "The zip code.",
"minimum": 0
}
}
}
在本例中,给定的会面体上有一个城市。在 Apicurio Registry 中,使用名称 city.json 创建对城市工件的引用。在 SerDes (SerDes)模式被获取时,也会获取 city 模式,因为它是从depoint 模式引用的。当序列化/撤销数据时,引用名称用于解析嵌套的模式,允许对量级模式和嵌套城市模式进行验证。
8.3.3. 使用 Apicurio Registry 配置 Protobuf SerDe 复制链接链接已复制到粘贴板!
本主题解释了如何为 Google Protobuf 使用 Kafka 客户端序列化器和反序列化器(SerDes)类。
Apicurio Registry 为 Protobuf 提供以下 Kafka 客户端 SerDes 类:
-
io.apicurio.registry.serde.protobuf.ProtobufKafkaSerializer -
io.apicurio.registry.serde.protobuf.ProtobufKafkaDeserializer
配置 Protobuf serializer
您可以配置 Protobuf serializer 类,如下所示:
- Apicurio Registry URL
- 工件解析器策略
- ID 位置
- ID 编码
- 模式验证
有关这些配置选项的详情,请查看以下部分:
配置 Protobuf deserializer
您必须配置 Protobuf deserializer 类,以匹配序列化器中的以下配置设置:
- Apicurio Registry URL
- ID 编码
配置属性名称和值与 serializer 相同。
配置反序列化器时不需要以下选项:
- 工件解析器策略
- ID 位置
deserializer 类可以从消息中决定这些选项的值。不需要该策略,因为 serializer 负责发送 ID 作为消息的一部分。
ID 位置是通过在消息有效负载开始时检查 magic 字节来确定的。如果找到该字节,则使用配置的处理程序从消息有效负载中读取 ID。如果没有找到 magic 字节,则会从消息标头中读取 ID。
Protobuf deserializer 不会反序列化到确切的 Protobuf 消息实现,而是切换到 DynamicMessage 实例。否则,没有适当的 API 来做。
protobuf SerDes 和工件引用
当使用 import 语句的复杂 Protobuf 消息时,导入的 Protobuf 消息作为单独的工件存储在 Apicurio Registry 中。然后,当 Apicurio Registry 获取检查 Protobuf 消息的主要模式时,也会检索引用的方案,以便检查并序列化完整的消息模式。
例如,以下 table_info.proto 模式文件包括导入的 mode.proto schema 文件:
带有导入的 mode.proto 文件的 table_info.proto 文件
syntax = "proto3";
package sample;
option java_package = "io.api.sample";
option java_multiple_files = true;
import "sample/mode.proto";
message TableInfo {
int32 winIndex = 1;
Mode mode = 2;
int32 min = 3;
int32 max = 4;
string id = 5;
string dataAdapter = 6;
string schema = 7;
string selector = 8;
string subscription_id = 9;
}
mode.proto file
syntax = "proto3";
package sample;
option java_package = "io.api.sample";
option java_multiple_files = true;
enum Mode {
MODE_UNKNOWN = 0;
RAW = 1;
MERGE = 2;
DISTINCT = 3;
COMMAND = 4;
}
在本例中,两个 Protobuf 工件存储在 Apicurio Registry 中,一个用于 TableInfo,一个用于 Mode。但是,由于 Mode 是 TableInfo 的一部分,因此当获取每个 TableInfo 以检查 SerDes 中的消息时,Mode 也作为 TableInfo 引用的构件返回。
第 9 章 Apicurio Registry 工件参考 复制链接链接已复制到粘贴板!
本章提供有关存储在 Apicurio Registry 中支持的工件类型、状态和元数据的参考信息。
9.1. Apicurio Registry 工件类型 复制链接链接已复制到粘贴板!
您可以在 Apicurio Registry 中存储和管理广泛的 schema 和 API 工件类型。
| 类型 | 描述 | 支持的版本 |
|---|---|---|
|
| AsyncAPI 规格 |
|
|
| Apache Avro 模式 |
|
|
| graphql 模式 | * |
|
| JSON 架构 |
|
|
| Apache Kafka Connect 模式 |
|
|
| OpenAPI 规格 |
|
|
| Google 协议缓冲模式 |
|
|
| Web 服务定义语言 | |
|
| 可扩展标记语言 | |
|
| XML 架构定义 |
9.2. Apicurio Registry 工件版本状态 复制链接链接已复制到粘贴板!
Apicurio Registry 中的有效工件版本状态为 ENABLED、DISABLED 和 DEPRECATED。
| 状态 | 描述 |
|---|---|
|
| 基本状态,所有操作都可用。 |
|
| 工件版本元数据可以使用 Apicurio Registry web 控制台查看和搜索,但其内容不能被任何客户端获取。 |
|
| 工件版本完全可用,但会在获取工件版本内容时将标头添加到 REST API 响应中。 |
9.3. Apicurio Registry 组元数据 复制链接链接已复制到粘贴板!
当在 Apicurio Registry 中创建组时,会创建并存储一组元数据属性。此元数据由系统生成的或用户生成的属性组成,它们是只读的,并在创建组后可以对其进行编辑的属性。
| 属性 | 类型 | 描述 |
|---|---|---|
|
| string | 创建组的用户的名称。 |
|
| date |
创建组的日期和时间,例如 |
|
| string | 修改组的用户的名称。 |
|
| date |
修改组的日期和时间,例如 |
| 属性 | 类型 | 描述 |
|---|---|---|
|
| string |
Apicurio Registry 中工件组的唯一标识符, |
| 属性 | 类型 | 描述 |
|---|---|---|
|
| string |
例如,对于组有可选的有意义的描述, |
|
| map |
与组关联的用户定义的名称值对列表。name 和 value 必须是字符串,如 |
更新组元数据
- 您可以使用 Apicurio Registry REST API 或 Web 控制台来更新一组可编辑的元数据属性。
-
您只能使用 Apicurio Registry REST API 更新
state属性。
9.4. Apicurio Registry 工件元数据 复制链接链接已复制到粘贴板!
当工件添加到 Apicurio Registry 时,会创建并存储一组元数据属性。此元数据由以只读形式的系统生成的或用户生成的属性组成,您可以在创建工件后更新这些属性。
| 属性 | 类型 | 描述 |
|---|---|---|
|
| date |
创建工件的日期和时间,例如 |
|
| 整数 |
Apicurio Registry 中工件版本的全局唯一标识符。例如,全局 ID |
|
| string | 修改工件的用户名称。 |
|
| date |
修改工件的日期和时间,例如 |
| 属性 | 类型 | 描述 |
|---|---|---|
|
| string |
Apicurio Registry 中的工件组的唯一标识符, |
|
| string |
Apicurio Registry 中的工件的唯一标识符。您可以提供工件 ID,或使用 Apicurio Registry 生成的 UUID,例如 |
|
| ArtifactType |
支持的工件类型,如 |
| 属性 | 类型 | 描述 |
|---|---|---|
|
| string |
可选的人类可读工件名称,如 |
|
| string |
例如,对工件的可选有意义的描述, |
|
| map |
与工件关联的用户定义的名称值对列表。name 和 value 必须是字符串,如 |
|
| string | 拥有工件的用户的名称。 |
更新工件元数据
- 您可以使用 Apicurio Registry REST API 或 Web 控制台来更新一组可编辑的元数据属性。
9.5. Apicurio Registry 工件版本元数据 复制链接链接已复制到粘贴板!
当工件版本添加到 Apicurio Registry 工件时,会创建并存储一组元数据属性以及工件版本内容。此元数据由以只读形式的系统生成的或用户生成的属性组成,您可以在创建工件版本后更新这些属性。
| 属性 | 类型 | 描述 |
|---|---|---|
|
| string | 创建工件版本的用户的名称。 |
|
| date |
创建工件版本的时间和时间,例如 |
|
| string | 修改工件版本的用户。 |
|
| date |
修改工件版本的日期和时间,例如 |
|
| 整数 |
Apicurio Registry 中工件版本内容的唯一标识符。当工件版本具有相同的内容时,同一内容 ID 可以被多个工件版本共享。例如,多个工件版本具有相同内容的多个工件版本可以使用 |
|
| 整数 |
Apicurio Registry 中工件版本的全局唯一标识符。例如,全局 ID |
| 属性 | 类型 | 描述 |
|---|---|---|
|
| string |
Apicurio Registry 中的工件组的唯一标识符, |
|
| string | Apicurio Registry 中的工件的唯一标识符。 |
|
| 整数 |
工件版本的版本字符串。如果没有提供,系统会生成一个新的后续版本。在使用 Apicurio Registry REST API、SDK 或 Maven 插件时,您可以提供一个版本,如 |
| 属性 | 类型 | 描述 |
|---|---|---|
|
| string |
可选的、人类可读的工件版本名称,如 |
|
| string |
例如,对于工件版本有可选有意义的描述 |
|
| map |
与工件版本关联的用户定义的名称值对列表。name 和 value 必须是字符串,如 |
|
| ArtifactState |
工件版本的状态: |
更新工件版本元数据
- 您可以使用 Apicurio Registry REST API 或 Web 控制台来更新一组可编辑的元数据属性。
-
您只能使用 Apicurio Registry REST API 更新
state属性。
第 10 章 Apicurio Registry 内容规则参考 复制链接链接已复制到粘贴板!
本章提供有关支持的内容规则类型、其工件类型支持级别以及工件特定和全局规则顺序的参考信息。
10.1. Apicurio Registry 内容规则类型 复制链接链接已复制到粘贴板!
您可以指定 VALIDITY、COMPATIBILITY 和 INTEGRITY 规则类型来管理 Apicurio Registry 中的内容演进。这些规则类型适用于全局规则和工件特定规则。
| 类型 | 描述 |
|---|---|
|
| 在将内容添加到 Apicurio Registry 前验证内容。此规则的可能配置值如下:
|
|
|
在更新工件时强制实施兼容性级别(例如,选择
|
|
| 在创建或更新工件时强制实施工件引用完整性。启用并配置此规则,以确保提供的任何工件引用都正确。此规则的可能配置值如下:
|
10.2. Apicurio Registry 内容规则成熟度 复制链接链接已复制到粘贴板!
不是所有内容规则完全实施 Apicurio Registry 支持的每个工件类型。下表显示了每个规则和工件类型的当前成熟度级别:
| 工件类型 | 有效期规则 | 兼容性规则 | 完整性规则 |
|---|---|---|---|
| Avro | Full | Full | Full |
| protobuf | Full | Full | Full |
| JSON Schema | Full | Full | 不支持映射检测 |
| OpenAPI | Full | Full | Full |
| AsyncAPI | 只包括语法 | None | Full |
| GraphQL | 只包括语法 | None | 不支持映射检测 |
| Kafka Connect | 只包括语法 | None | 不支持映射检测 |
| WSDL | Full | None | 不支持映射检测 |
| XML | Full | None | 不支持映射检测 |
| XSD | Full | None | 不支持映射检测 |
10.3. Apicurio Registry 内容规则优先级 复制链接链接已复制到粘贴板!
当您添加或更新工件时,Apicurio Registry 应用规则来检查工件内容的有效性、兼容性或完整性。配置的特定于工件的规则会覆盖等同配置的全局规则,如下表中所示。
| 特定于工件的规则 | 全局规则 | 应用到此工件的规则 | 其他工件可用的全局规则? |
|---|---|---|---|
| Enabled | Enabled | 特定于工件 | 是 |
| Disabled | Enabled | 全局 | 是 |
| Disabled | Disabled | None | 否 |
| enabled,设置为 None | Enabled | None | 是 |
| Disabled | enabled,设置为 None | None | 否 |
附录 A. 使用您的订阅 复制链接链接已复制到粘贴板!
Apicurio Registry 通过软件订阅提供。要管理您的订阅,请访问红帽客户门户中的帐户。
访问您的帐户
- 转至 access.redhat.com。
- 如果您还没有帐户,请创建一个帐户。
- 登录到您的帐户。
激活订阅
- 转至 access.redhat.com。
- 导航到 My Subscriptions。
- 导航到 激活订阅 并输入您的 16 位激活号。
下载 ZIP 和 TAR 文件
要访问 ZIP 或 TAR 文件,请使用客户门户网站查找要下载的相关文件。如果您使用 RPM 软件包,则不需要这一步。
- 打开浏览器并登录红帽客户门户网站 产品下载页面,网址为 access.redhat.com/downloads。
- 在 Integration 和 Automation 类别中找到 Red Hat Integration 条目。
- 选择所需的 Apicurio Registry 产品。此时会打开 Software Downloads 页面。
- 单击组件的 Download 链接。
更新于 2025-05-31