Service Registry 用户指南
管理 Service Registry 2.4 中的模式和 API
摘要
前言 复制链接链接已复制到粘贴板!
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
对红帽文档提供反馈
我们感谢您对我们文档的反馈。要提供反馈,请突出显示文档中的文本并添加注释。
先决条件
- 已登陆到红帽客户门户网站。
- 在红帽客户门户网站中,文档采用 Multi-page HTML 查看格式。
流程
要提供反馈,请执行以下步骤:
点文档右上角的反馈按钮查看现有的反馈。
注意反馈功能仅在多页 HTML 格式中启用。
- 高亮标记您要提供反馈的文档中的部分。
点在高亮文本旁弹出的 Add Feedback。
文本框将在页面右侧的"反馈"部分中打开。
在文本框中输入您的反馈,然后点 Submit。
创建了一个与文档相关的问题。
- 要查看问题,请点击反馈视图中的问题链接。
第 1 章 Service Registry 简介 复制链接链接已复制到粘贴板!
本章介绍了 Service Registry 概念和功能,并提供了有关存储在 registry 中支持的工件类型的详情:
- 第 1.1 节 “什么是 Service Registry?”
- 第 1.2 节 “Service Registry 中的 schema 和 API 工件”
- 第 1.3 节 “使用 Service Registry web 控制台管理内容”
- 第 1.4 节 “客户端的 Service Registry REST API”
- 第 1.5 节 “Service Registry 存储选项”
- 第 1.6 节 “使用 schemas 和 Java 客户端序列化器/反序列化器验证 Kafka 消息”
- 第 1.7 节 “使用 Kafka Connect 转换器将数据流传输到外部系统”
- 第 1.8 节 “Service Registry 演示示例”
- 第 1.9 节 “Service Registry 可用发行版本”
1.1. 什么是 Service Registry? 复制链接链接已复制到粘贴板!
Service Registry 是一个数据存储,用于在事件驱动的和 API 架构间共享标准事件模式和 API 设计。您可以使用 Service Registry 将数据的结构与客户端应用程序分离,并使用 REST 接口在运行时共享和管理您的数据类型和 API 描述。
客户端应用程序可以在运行时动态推送或从 Service Registry 拉取最新的模式更新,而无需重新部署。开发人员团队可以查询已在生产环境中部署的服务所需的现有模式,并可在开发中注册新服务所需的新模式。
您可以通过在客户端应用程序代码中指定 Service Registry URL 来启用客户端应用程序使用存储在 Service Registry 中的模式和 API 设计。Service Registry 可以存储用于序列化和反序列化消息的模式,这些消息从客户端应用程序引用,以确保它们发送和接收的信息与这些模式兼容。
使用 Service Registry 将数据结构与应用程序分离,通过降低整个消息大小来降低成本,并通过提高整个机构内的 schema 和 API 设计的一致性重复使用来创建费用。Service Registry 提供了一个 Web 控制台,可方便开发人员和管理员管理 registry 内容。
您可以配置可选规则来管理 Service Registry 内容的演进。这包括规则,以确保上传的内容有效,或者与其他版本兼容。任何配置的规则都必须在上传到 Service Registry 之前传递,这样可确保不会在无效或不兼容的模式或 API 设计中造成时间。
Service Registry 基于 Apicurio Registry 开源社区项目。详情请查看 https://github.com/apicurio/apicurio-registry。
Service Registry 功能
- 标准事件模式和 API 规格的多个有效负载格式,如 Apache Avro、JSON Schema、Google Protobuf、AsyncAPI、OpenAPI 等。
- AMQ Streams 或 PostgreSQL 数据库中可插拔的 Service Registry 存储选项。
- 用于内容验证、兼容性和完整性的规则,以管理 Service Registry 内容随时间变化的方式。
- 使用 Web 控制台、REST API、命令行、Maven 插件或 Java 客户端管理 Service Registry 内容。
- 完整的 Apache Kafka 模式 registry 支持,包括与外部系统的 Kafka Connect 集成。
- Kafka 客户端序列化器/反序列化器(SerDes)在运行时验证消息类型。
- 与现有 Confluent 模式 registry 客户端应用程序兼容。
- 云原生 Quarkus Java 运行时,用于低内存占用和快速部署时间。
- 基于 Operator 在 OpenShift 上安装 Service Registry。
- 使用红帽单点登录的 OpenID Connect (OIDC)身份验证。
1.2. Service Registry 中的 schema 和 API 工件 复制链接链接已复制到粘贴板!
存储在 Service Registry 中的项目(如事件 schema 和 API 设计)称为 registry 工件。下面显示了一个简单共享价格应用程序的 JSON 格式的 Apache Avro 模式工件示例:
Avro 模式示例
当将模式或 API 设计添加为 Service Registry 中的工件时,客户端应用程序可以使用该模式或 API 设计来验证客户端消息是否在运行时符合正确的数据结构。
模式和 API 组
工件组 是一个可选的 schema 或 API 工件集合。每个组都包含一组逻辑相关的模式或 API 设计,通常由属于特定应用程序或机构的单一实体管理。
您可以在添加模式和 API 设计时创建可选的工件组,以便在 Service Registry 中组织它们。例如,您可以创建组来匹配 development 和 production 的应用程序环境,或 sales 和 engineering 机构。
模式和 API 组可以包含多个工件类型。例如,您可以在同一个组中具有 Protobuf、Avro、JSON Schema、OpenAPI 或 AsyncAPI 工件。
您可以使用 Service Registry web 控制台、REST API、命令行、Maven 插件或 Java 客户端应用程序创建模式和 API 工件和组。以下简单示例演示了使用 Core Registry REST API:
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-registry.example.com/apis/registry/v2/groups/my-group/artifacts
$ 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-registry.example.com/apis/registry/v2/groups/my-group/artifacts
本例创建一个名为 my-group 的工件组,并添加一个 Avro 模式,工件 ID 为 share-price。
在使用 Service Registry web 控制台时指定组是可选的,并自动创建默认组。使用 REST API 或 Maven 插件时,如果您不想创建唯一组,请在 API 路径中指定 默认组。
对其他模式和 API 的引用
有些 Service Registry 工件类型可以包含从一个 工件文件到另一个工件文件的工件引用。您可以通过定义可重复使用的模式或 API 组件来创建参与,然后从多个位置引用它们。例如,您可以使用 $ref 语句在 JSON Schema 或 OpenAPI 中指定引用,或使用 import 语句在 Google Protobuf 中指定引用,或使用嵌套命名空间的 Apache Avro 指定引用。
以下示例显示了一个名为 TradeKey 的简单 Avro 模式,其中包含使用嵌套命名空间对名为 Exchange 的另一个模式的引用:
带有嵌套交换模式的 Tradekey 模式
Exchange 模式
工件引用存储在 Service Registry 中,作为工件元数据集合,这些元数据从工件类型引用映射到内部 Service Registry 引用。Service Registry 中的每个工件引用都由以下内容组成:
- 组 ID
- 工件 ID
- 工件版本
- 工件引用名称
您可以使用 Service Registry core REST API、Maven 插件和 Java 序列化器/反序列化器(SerDes)来管理工件引用。Service Registry 将工件引用与工件内容一起存储。Service Registry 还维护所有工件引用的集合,以便您可以搜索它们或列出特定工件的所有引用。
支持的工件类型
Service Registry 目前只支持以下工件类型的工件引用:
- avro
- protobuf
- JSON Schema
1.3. 使用 Service Registry web 控制台管理内容 复制链接链接已复制到粘贴板!
您可以使用 Service Registry web 控制台浏览和搜索存储在 registry 中的 schema 和 API 工件和可选组,并添加新的 schema 和 API 工件、组和版本。您可以根据标签、名称、组和描述搜索工件。您可以查看工件的内容或其可用版本,或者在本地下载工件文件。
您还可以为 registry 内容配置可选规则,包括全局和每个 schema 和 API 工件。当新的模式和 API 工件或版本上传到 registry 时,会应用这些可选规则以进行内容验证和兼容性。
如需了解更多详细信息,请参阅 第 10 章 Service Registry 内容规则引用。
图 1.1. Service Registry web 控制台
Service Registry web 控制台可从 http://MY_REGISTRY_URL/ui 获得。
1.4. 客户端的 Service Registry REST API 复制链接链接已复制到粘贴板!
客户端应用程序可以使用 Core Registry API v2 管理 Service Registry 中的 schema 和 API 工件。此 API 为以下功能提供操作:
- Admin
-
在
.zip文件中导出或导入 Service Registry 数据,并在运行时管理 Service Registry 实例的日志记录级别。 - 工件
- 管理存储在 Service Registry 中的 schema 和 API 工件。您还可以管理工件的生命周期状态: enabled、disabled 或 deprecated。
- 工件元数据
- 管理模式或 API 工件的详细信息。您可以编辑工件名称、描述或标签等详情。工件组等详情,以及工件创建或修改时为只读。
- 工件规则
- 配置规则以管理特定模式或 API 工件的内容演进,以防止将无效或不兼容的内容添加到 Service Registry 中。工件规则覆盖配置的任何全局规则。
- 工件版本
- 管理更新模式或 API 工件时创建的版本。您还可以管理工件版本的生命周期状态: enabled、disabled 或 deprecated。
- 全局规则
- 配置规则以管理所有模式和 API 工件的内容演进,以防止将无效或不兼容的内容添加到 Service Registry 中。只有工件没有配置自己的特定工件规则时,才会应用全局规则。
- 搜索
- 浏览或搜索 schema、API 工件和版本,例如按名称、组、描述或标签。
- System
- 获取 Service Registry 版本以及 Service Registry 实例的资源的限制。
- 用户
- 获取当前的 Service Registry 用户。
与其他模式 registry REST API 兼容性
Service Registry 通过包括其各自 REST API 的实现来提供与以下架构 registry 的兼容性:
- Service Registry Core Registry API v1
- confluent Schema Registry API v6
- Confluent Schema Registry API v7
- CNCF CloudEvents Schema Registry API v0
使用 Confluent 客户端库的应用程序可以使用 Service Registry 作为 drop-in 替换。如需了解更多详细信息,请参阅 重新放置一致性架构 Registry。
1.5. Service Registry 存储选项 复制链接链接已复制到粘贴板!
Service Registry 为 registry 数据的底层存储提供以下选项:
| 存储选项 | 描述 |
|---|---|
| PostgreSQL 数据库 | PostgreSQL 是在生产环境中性能、稳定性和数据管理(备份/恢复等等)的建议数据存储选项。 |
| AMQ Streams | Kafka 存储为无法使用数据库管理专家的生产环境提供,或者 Kafka 中的存储是特定要求。 |
1.6. 使用 schemas 和 Java 客户端序列化器/反序列化器验证 Kafka 消息 复制链接链接已复制到粘贴板!
Kafka 生成者应用程序可以使用序列化器来编码符合特定事件模式的消息。然后,Kafka 消费者应用程序可以使用 deserializers 来验证信息是否根据特定的模式 ID 序列化。
图 1.2. Service Registry 和 Kafka 客户端 SerDes 架构
Service Registry 提供 Kafka 客户端序列化器/反序列化器(SerDes),以便在运行时验证以下消息类型:
- Apache Avro
- Google Protobuf
- JSON Schema
Service Registry Maven 存储库和源代码分布包括这些消息类型的 Kafka SerDes 实现,Kafka 客户端应用程序开发人员可以使用它们与 Service Registry 集成。
这些实现包括每个支持的消息类型的自定义 Java 类,如 io.apicurio.registry.serde.avro,客户端应用程序可在运行时从 Service Registry 中拉取模式进行验证。
1.7. 使用 Kafka Connect 转换器将数据流传输到外部系统 复制链接链接已复制到粘贴板!
您可以使用 Apache Kafka Connect 的 Service Registry 来流传输 Kafka 和外部系统之间的数据。使用 Kafka Connect,您可以为不同的系统定义连接器,将大量数据移到基于 Kafka 的系统中和移出。
图 1.3. Service Registry 和 Kafka Connect 架构
Service Registry 为 Kafka Connect 提供以下功能:
- Kafka Connect 模式的存储
- Apache Avro 和 JSON 架构的 Kafka Connect 转换器
- 管理模式的核心 Registry API
您可以使用 Avro 和 JSON Schema 转换器将 Kafka Connect 模式映射到 Avro 或 JSON 模式。然后,这些模式可以序列化消息键和值,格式为紧凑的 Avro 二进制格式或人类可读的 JSON 格式。转换的 JSON 也不详细,因为消息不包含架构信息,而只有架构 ID。
Service Registry 可以管理和跟踪 Kafka 主题中使用的 Avro 和 JSON 模式。由于架构存储在 Service Registry 中,并与消息内容分离,因此每个消息必须仅包含 tiny 模式标识符。对于 Kafka 等 I/O 绑定系统,这意味着生产者和消费者的总吞吐量。
此用例也使用由 Service Registry 提供的 Avro 和 JSON Schema 序列化器和反序列化器(SerDes)。您写入用于消耗更改事件的 Kafka 消费者应用程序可以使用 Avro 或 JSON SerDes 来反序列化这些更改事件。您可以将这些 SerDes 安装到任何基于 Kafka 的系统中,并将它们与 Kafka Connect 一起使用,或者与基于 Kafka Connect 的系统(如 Debezium 和 Camel Kafka Connector)一起使用。
1.8. Service Registry 演示示例 复制链接链接已复制到粘贴板!
Service Registry 提供了开源示例应用程序,它演示了如何在不同的用例中使用 Service Registry。例如,它们包括 Kafka 序列化器和反序列化器(SerDes) Java 类使用的存储模式。这些类从 Service Registry 获取模式,以便在生成或消耗操作以序列化、反序列化或验证 Kafka 消息有效负载时使用。
这些应用程序演示了用例,如下例所示:
- Apache Avro Kafka SerDes
- Apache Avro Maven 插件
- Apache Camel Quarkus 和 Kafka
- 云事件
- confluent Kafka SerDes
- 自定义 ID 策略
- Google Protobuf Kafka SerDes
- JSON 架构 Kafka SerDes
- REST 客户端
1.9. Service Registry 可用发行版本 复制链接链接已复制到粘贴板!
Service Registry 提供以下分发选项。
| 分发 | 位置 | 发行类别 |
|---|---|---|
| Service Registry Operator | OpenShift Web 控制台在 Operators → OperatorHub下 | 公开发行 |
| Service Registry Operator 的容器镜像 | 公开发行 | |
| AMQ Streams 中的 Kafka 存储的容器镜像 | 公开发行 | |
| PostgreSQL 中数据库存储的容器镜像 | 公开发行 |
| 分发 | 位置 | 发行类别 |
|---|---|---|
| 安装的自定义资源定义示例 | 公开发行 | |
| Service Registry v1 到 v2 迁移工具 | 公开发行 | |
| Maven 存储库 | 公开发行 | |
| 源代码 | 公开发行 | |
| Kafka Connect 转换器 | 公开发行 |
您必须有 Red Hat Integration 订阅并登录到红帽客户门户网站,才能访问可用的 Service Registry 发行版本。
第 2 章 Service Registry 内容规则 复制链接链接已复制到粘贴板!
本章介绍了用于管理 Service Registry 内容的可选规则,并提供了有关可用规则配置的详情:
2.1. 使用规则管理 Service Registry 内容 复制链接链接已复制到粘贴板!
要管理添加到 Service Registry 中的工件内容的演进,您可以配置可选规则。所有配置的全局规则或特定于工件的规则都必须通过,然后才能将新的工件版本上传到 Service Registry。配置的特定于工件的规则会覆盖任何配置的全局规则。
这些规则的目标是防止将无效内容添加到 Service Registry 中。例如,内容可能会因为以下原因无效:
-
给定工件类型(例如
AVRO或PROTOBUF)的无效语法。 - 有效的语法,但语义违反了规格。
- 不兼容,当新内容包含与当前工件版本相关的更改时。
- 工件参考完整性,例如:重复或不存在的工件引用映射。
您可以使用 Service Registry web 控制台、REST API 命令或 Java 客户端应用程序启用可选内容规则。
2.1.1. 应用规则的时间 复制链接链接已复制到粘贴板!
只有在将内容添加到 Service Registry 时,才会应用规则。这包括以下 REST 操作:
- 添加工件
- 更新工件
- 添加工件版本
如果违反规则,Service Registry 会返回 HTTP 错误。响应正文包括违反的规则,以及显示错误的消息。
2.1.2. 规则优先级顺序 复制链接链接已复制到粘贴板!
特定于工件和全局规则的优先顺序如下:
- 如果您启用特定于工件的规则,并且启用了等同的全局规则,工件规则会覆盖全局规则。
- 如果您禁用特定于工件的规则,并且启用了等同的全局规则,则应用全局规则。
- 如果您禁用特定于工件的规则,且禁用了等同的全局规则,则会为所有工件禁用该规则。
-
如果您在工件级别上将规则值设置为
NONE,您需要覆盖启用的全局规则。在这种情况下,工件规则值为NONE优先于这个工件,但启用的全局规则将继续应用到在工件级别禁用规则的任何其他工件。
2.1.3. 规则的工作方式 复制链接链接已复制到粘贴板!
每个规则都有一个名称和配置信息。Service Registry 维护每个工件的规则列表以及全局规则列表。列表中的每一规则都由规则实施的名称和配置组成。
提供了一个规则,其中包含当前版本的工件内容(如果存在),以及要添加的工件的新版本。根据工件是否通过该规则,规则实施会返回 true 或 false。如果没有,Service Registry 会在 HTTP 错误响应中报告原因。有些规则可能无法使用以前的内容版本。例如,兼容性规则使用之前的版本,但语法或语义有效规则不使用。
2.1.4. 内容规则配置 复制链接链接已复制到粘贴板!
管理员可以配置 Service Registry 全局规则和特定于工件的规则。开发人员只能配置特定于工件的规则。
Service Registry 应用为特定工件配置的规则。如果在这个级别上没有配置规则,Service Registry 会应用全局配置的规则。如果没有配置全局规则,则不会应用规则。
配置工件规则
您可以使用 Service Registry web 控制台或 REST API 配置工件规则。详情请查看以下内容:
配置全局规则
管理员可以以多种方式配置全局规则:
-
在 REST API 中使用
admin/rules操作 - 使用 Service Registry web 控制台
- 使用 Service Registry 应用程序属性设置默认全局规则
配置默认全局规则
管理员可以在应用级别上配置 Service Registry 以启用或禁用全局规则。您可以使用以下应用程序属性格式,在安装时配置默认的全局规则,而无需安装后配置:
registry.rules.global.<ruleName>
registry.rules.global.<ruleName>
目前支持以下规则名称:
-
兼容性 -
有效期 -
完整性
application 属性的值必须是特定于所配置规则的有效配置选项。
您可以将这些应用程序属性配置为 Java 系统属性,或者在 Quarkus application.properties 文件中包含它们。如需了解更多详细信息,请参阅 Quarkus 文档。
第 3 章 使用 Web 控制台管理 Service Registry 内容 复制链接链接已复制到粘贴板!
您可以使用 Service Registry web 控制台管理 Service Registry 中存储的模式和 API 工件。这包括上传和浏览 Service Registry 内容、为内容配置可选规则,以及生成客户端 sdk 代码:
- 第 3.1 节 “使用 Service Registry web 控制台查看工件”
- 第 3.2 节 “使用 Service Registry web 控制台添加工件”
- 第 3.3 节 “使用 Service Registry web 控制台配置内容规则”
- 第 3.4 节 “使用 Service Registry web 控制台为 OpenAPI 工件生成客户端 SDK”
- 第 3.5 节 “使用 Service Registry web 控制台更改工件所有者”
- 第 3.6 节 “使用 Web 控制台配置 Service Registry 实例设置”
- 第 3.7 节 “使用 Service Registry web 控制台导出和导入数据”
3.1. 使用 Service Registry web 控制台查看工件 复制链接链接已复制到粘贴板!
您可以使用 Service Registry web 控制台浏览存储在 Service Registry 中的 schema 和 API 工件。本节演示了查看 Service Registry 工件、组、版本和工件规则的简单示例。
先决条件
- Service Registry 已在您的环境中安装并运行。
登录到 Service Registry web 控制台:
http://MY_REGISTRY_URL/ui- 使用 Web 控制台、命令行、Maven 插件或 Java 客户端应用程序将工件添加到 Service Registry 中。
流程
在 Artifacts 选项卡中,浏览存储在 Service Registry 中的工件列表,或者输入搜索字符串来查找工件。您可以选择根据特定条件(如名称、组、标签或全局 ID)搜索。
图 3.1. Service Registry web 控制台中的工件
点工件查看以下详情:
- 概述 :显示工件版本元数据,如工件名称、工件 ID、全局 ID、内容 ID、标签、属性等。另外,还显示您可以为工件内容配置的有效性和兼容性规则。
- 文档 (仅限 OpenAPI 和 AsyncAPI):显示自动生成的 REST API 文档。
- 内容 :显示完整工件内容的只读视图。对于 JSON 内容,您可以点击 JSON 或 YAML 来显示您首选的格式。
- 参考 :显示此工件引用的所有工件的只读视图。您还可以单击 引用此工件的 View 工件。
- 如果添加了此工件的额外版本,您可以从页面标头中的 Version 列表中选择它们。
-
要将工件内容保存到本地文件,如
my-openapi.json或my-protobuf-schema.proto,然后点击页面末尾的 Download。
3.2. 使用 Service Registry web 控制台添加工件 复制链接链接已复制到粘贴板!
您可以使用 Service Registry web 控制台将 schema 和 API 工件上传到 Service Registry。本节演示了上传 Service Registry 工件和添加新工件版本的简单示例。
先决条件
- Service Registry 已在您的环境中安装并运行。
登录到 Service Registry web 控制台:
http://MY_REGISTRY_URL/ui
流程
在 Artifacts 选项卡中,点 Upload artifact,并指定以下详情:
-
组和 ID :使用默认空设置自动生成工件 ID,并将工件
添加到默认工件组中。或者,您可以输入可选的工件组名称或 ID。 - 类型 :使用默认的 Auto-Detect 设置来自动检测工件类型,或者从列表中选择工件类型,如 Avro Schema 或 OpenAPI。您必须手动选择 Kafka Connect Schema 工件类型,该类型无法被自动探测。
工件 :使用以下选项之一指定工件位置:
-
从文件 :点 Browse,然后选择一个文件,或者拖放文件。例如,
my-openapi.json或my-schema.proto。或者,您也可以在文本框中输入文件内容。 -
从 URL: 输入有效并可访问 URL,然后单击 Fetch。例如:
https://petstore3.swagger.io/api/v3/openapi.json。
-
从文件 :点 Browse,然后选择一个文件,或者拖放文件。例如,
-
组和 ID :使用默认空设置自动生成工件 ID,并将工件
点 Upload 并查看工件详情:
- 概述 :显示工件版本元数据,如工件名称、工件 ID、全局 ID、内容 ID、标签、属性等。另外,还显示您可以为工件内容配置的有效性和兼容性规则。
- 文档 (仅限 OpenAPI 和 AsyncAPI):显示自动生成的 REST API 文档。
- 内容 :显示完整工件内容的只读视图。对于 JSON 内容,您可以点击 JSON 或 YAML 来显示您首选的格式。
参考 :显示此工件引用的所有工件的只读视图。您还可以单击 引用此工件的 View 工件。您只能使用 Service Registry Maven 插件或 REST API 添加工件引用。
以下示例显示了 OpenAPI 工件示例:
图 3.2. Service Registry web 控制台中的工件详情
在 Overview 选项卡中,点 Edit Mapping 图标编辑工件元数据,如名称或描述。
您还可以输入一个可选的以逗号分隔的标签列表来搜索,或者添加与工件关联的任意属性的键值对。要添加属性,请执行以下步骤:
- 点 Add property。
- 输入键名称和值。
- 重复前两个步骤来添加多个属性。
- 点击 Save。
-
要将工件内容保存到本地文件,如
my-protobuf-schema.proto或my-openapi.json,请单击页面末尾的 Download。 -
要添加新工件版本,请单击页面标头中的 Upload new version,然后拖放或点击 Browse 上传文件,如
my-avro-schema.json或my-openapi.json。 要删除工件,请单击页面标头中的 Delete。
警告删除工件会删除工件及其所有版本,且无法撤消。
3.3. 使用 Service Registry web 控制台配置内容规则 复制链接链接已复制到粘贴板!
您可以使用 Service Registry web 控制台配置可选规则,以防止将无效或不兼容的内容添加到 Service Registry 中。所有配置的、特定于工件的规则或全局规则都必须通过,然后才能将新的工件版本上传到 Service Registry。配置的特定于工件的规则会覆盖任何配置的全局规则。本节展示了配置全局和特定于工件的规则的简单示例。
先决条件
- Service Registry 已在您的环境中安装并运行。
登录到 Service Registry web 控制台:
http://MY_REGISTRY_URL/ui- 使用 Web 控制台、命令行、Maven 插件或 Java 客户端应用程序将工件添加到 Service Registry 中。
- 启用基于角色的授权后,您对全局规则和特定于工件的规则具有管理员访问权限,或者只对特定于工件的规则进行开发人员访问权限。
流程
- 在 Artifacts 选项卡中,浏览 Service Registry 中的工件列表,或者输入搜索字符串来查找工件。您可以选择根据特定条件(如工件名称、组、标签或全局 ID)搜索。
- 点工件查看其版本详情和内容规则。
在 特定于 工件的规则中,点 Enable 为工件内容配置有效性、兼容性或完整性规则,并从列表中选择适当的规则配置。例如,对于 Validity 规则,请选择 Full。
图 3.3. Service Registry web 控制台中的工件内容规则
- 要访问全局规则,请点 Global rules 选项卡。点 Enable 为所有工件内容配置全局有效性、兼容性或完整性规则,然后从列表中选择适当的规则配置。
- 要禁用工件规则或全局规则,请单击规则旁边的垃圾图标。
3.4. 使用 Service Registry web 控制台为 OpenAPI 工件生成客户端 SDK 复制链接链接已复制到粘贴板!
您可以使用 Service Registry web 控制台为 OpenAPI 工件配置、生成和下载客户端软件开发套件(SDK)。然后,您可以使用生成的客户端 SDK 根据 OpenAPI 为特定平台构建客户端应用程序。
Service Registry 为以下编程语言生成客户端 SDK:
- C#
- Go
- Java
- PHP
- Python
- Ruby
- Swift
- TypeScript
OpenAPI 工件的客户端 SDK 仅在浏览器中运行,无法使用 API 自动运行。每次在 Service Registry 中添加新工件版本时,您必须重新生成客户端 SDK。
先决条件
- Service Registry 已在您的环境中安装并运行。
登录到 Service Registry web 控制台:
http://MY_REGISTRY_URL/ui- 使用 Web 控制台、命令行、Maven 插件或 Java 客户端应用程序将 OpenAPI 工件添加到 Service Registry 中。
流程
- 在 Artifacts 选项卡中,浏览存储在 Service Registry 中的工件列表,或者输入搜索字符串来查找特定的 OpenAPI 工件。您可以从列表中选择按条件(如名称、组、标签或全局 ID)搜索。
- 点列表中的 OpenAPI 工件来查看其详情。
在 Version metadata 部分中,点 Generate client SDK,并在对话框中配置以下设置:
- 语言 :选择生成客户端 SDK 的编程语言,例如 Java。
-
生成的客户端类名称 :输入客户端 SDK 的类名称,如
MyJavaClientSDK。 -
生成的客户端软件包名称 :输入客户端 SDK 的软件包名称,例如
io.my.example.sdk
点 Show advanced settings 配置可选的以逗号分隔的路径模式列表来包含或排除:
-
包括路径模式 :输入生成客户端 SDK 时要包括的具体路径,例如:
**/ netobserv, **/my-path8:0:1::。如果此字段为空,则会包括所有路径。 排除路径模式 :在生成客户端 SDK 时输入要排除的具体路径,例如: beyond
/my-other-pathAttr。如果此字段为空,则不会排除任何路径。图 3.4. 在 Service Registry web 控制台中生成 Java 客户端 SDK
-
包括路径模式 :输入生成客户端 SDK 时要包括的具体路径,例如:
- 当您在对话框中配置了设置后,点 Generate and download。
-
在对话框中输入 client SDK 的文件名,如
my-client-java.zip,然后单击 Save 以下载。
3.5. 使用 Service Registry web 控制台更改工件所有者 复制链接链接已复制到粘贴板!
作为管理员或作为模式或 API 工件的所有者,您可以使用 Service Registry Web 控制台将工件所有者更改为另一个用户帐户。
例如,如果为 Settings 选项卡上的 Service Registry 实例设置了 Artifact owner-only 授权选项,以便只有拥有者或管理员可以修改工件,则此功能很有用。如果所有者用户离开机构或所有者帐户被删除,您可能需要更改所有者。
只有在 Service Registry 实例部署时启用了身份验证时,才会显示 Artifact owner-only authorization 设置和工件 Owner 字段。如需了解更多详细信息,请参阅在 OpenShift 上安装和部署 Service Registry。
先决条件
- 部署 Service Registry 实例并创建工件。
以工件的当前所有者或管理员身份登录到 Service Registry web 控制台:
http://MY_REGISTRY_URL/ui
流程
- 在 Artifacts 选项卡中,浏览存储在 Service Registry 中的工件列表,或者输入搜索字符串来查找工件。您可以从列表中选择按条件(如名称、组、标签或全局 ID)搜索。
- 点击您要重新分配的工件。
- 在 Version metadata 部分中,点 Owner 字段旁的铅笔图标。
- 在 New owner 字段中,选择或输入帐户名称。
- 单击 Change owner。
3.6. 使用 Web 控制台配置 Service Registry 实例设置 复制链接链接已复制到粘贴板!
作为管理员,您可以使用 Service Registry web 控制台在运行时为 Service Registry 实例配置动态设置。您可以管理身份验证、授权和 API 兼容性等功能的配置选项。
只有在部署 Service Registry 实例时已经启用了身份验证,Web 控制台中才会在 web 控制台中显示身份验证和授权设置。如需了解更多详细信息,请参阅在 OpenShift 上安装和部署 Service Registry。
先决条件
- Service Registry 实例已经部署。
您可以使用管理员访问权限登录到 Service Registry web 控制台:
http://MY_REGISTRY_URL/ui
流程
- 在 Service Registry web 控制台中点 Settings 选项卡。
选择您要为此 Service Registry 实例配置的设置:
Expand 表 3.1. 身份验证设置 设置 描述 HTTP 基本身份验证
仅在已经启用身份验证时显示。选择后,Service Registry 用户可以使用 HTTP 基本身份验证进行身份验证,除了 OAuth 外。默认情况下不选择。
Expand 表 3.2. 授权设置 设置 描述 匿名读取访问
仅在已经选择身份验证时显示。选择后,Service Registry 会在没有凭证的情况下授予对匿名用户请求的只读访问权限。如果要使用此实例在外部发布模式或 API,则此设置很有用。默认情况下不选择。
仅工件所有者授权
仅在已经启用身份验证时显示。选择后,只有创建工件的用户才能修改该工件。默认情况下不选择。
工件组所有者授权
仅在已经启用身份验证并选择了 Artifact owner-only 授权 时显示。选择后,只有创建工件组的用户才能访问该工件组,例如,在该组中添加或删除工件。默认情况下不选择。
经过身份验证的读取访问权限
仅在已经启用身份验证时显示。选择后,Service Registry 至少为来自任何经过身份验证的用户的请求赋予只读访问权限,而不考虑其用户角色。默认情况下不选择。
Expand 表 3.3. 兼容性设置 设置 描述 旧 ID 模式(兼容性 API)
选择后,Confluent Schema Registry 兼容性 API 将使用
globalId而不是contentId作为工件标识符。当基于 v1 Core Registry API 从旧的 Service Registry 实例迁移时,此设置很有用。默认情况下不选择。Expand 表 3.4. Web 控制台设置 设置 描述 下载链接到期
由于安全原因,生成的到
.zip下载文件的链接的秒数,例如,从实例导出工件数据时。默认值为 30 秒。UI 只读模式
选择后,Service Registry web 控制台被设置为只读,防止创建、读取、更新或删除操作。使用 Core Registry API 所做的更改不受此设置的影响。默认情况下不选择。
Expand 表 3.5. 其他属性 设置 描述 删除工件版本
选择后,用户可以使用 Core Registry API 删除此实例中的工件版本。默认情况下不选择。
3.7. 使用 Service Registry web 控制台导出和导入数据 复制链接链接已复制到粘贴板!
作为管理员,您可以使用 Service Registry web 控制台从一个 Service Registry 实例导出数据,并将这些数据导入到另一个 Service Registry 实例中。您可以使用此功能在不同实例间轻松迁移数据。
以下示例演示了如何将 .zip 文件中的现有数据从一个 Service Registry 实例导出到另一个实例。Service Registry 实例中包含的所有工件数据都会在 .zip 文件中导出。
您只能导入从另一个 Service Registry 实例导出的 Service Registry 数据。
先决条件
Service Registry 实例已创建,如下所示:
- 从中导出的源实例至少包含一个模式或 API 工件
- 要导入到的目标实例为空,以保留唯一 ID
您可以使用管理员访问权限登录到 Service Registry web 控制台:
http://MY_REGISTRY_URL/ui
流程
- 在源 Service Registry 实例的 web 控制台中,查看 Artifacts 选项卡。
-
单击 Upload 工件 旁边的选项图标(三个垂直点),然后选择 Download all artifacts (.zip file),将此 Service Registry 实例的数据导出到
.zip下载文件。 - 在目标 Service Registry 实例的 web 控制台中,查看 Artifacts 选项卡。
- 单击 Upload artifact 旁边的选项图标,然后选择 Upload multiple artifacts。
-
拖放或浏览到您之前导出的
.zip下载文件。 - 点 Upload 并等待要导入的数据。
第 4 章 使用 REST API 管理 Service Registry 内容 复制链接链接已复制到粘贴板!
客户端应用程序可以使用 Service Registry REST API 操作来管理 Service Registry 中的 schema 和 API 工件,例如在生产环境中部署的 CI/CD 管道。Core Registry API v2 为存储在 Service Registry 中的工件、版本、元数据和规则提供操作。如需更多信息,请参阅 Apicurio Registry REST API 文档。
本章演示了如何使用 Core Registry API v2 执行以下任务:
4.1. 使用 Service Registry REST API 命令管理 schema 和 API 工件 复制链接链接已复制到粘贴板!
本节展示了一个简单的基于 curl 的示例,它使用 Core Registry API v2 在 Service Registry 中添加和检索简单的架构工件。
先决条件
- Service Registry 已在您的环境中安装并运行。
流程
使用
/groups/{group}/artifacts操作将工件添加到 Service Registry。以下示例curl命令为共享价格应用程序添加一个简单的模式工件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
这个示例添加了一个 Apache Avro 模式工件,工件 ID 为
share-price。如果您没有指定唯一的工件 ID,Service Registry 将自动作为 UUID 生成一个。 -
MY-REGISTRY-URL是部署 Service Registry 的主机名。例如:my-cluster-service-registry-myproject.example.com。 -
本例指定 API 路径中的
my-group组 ID。如果没有指定唯一组 ID,则必须在 API 路径中指定../groups/default。
-
这个示例添加了一个 Apache Avro 模式工件,工件 ID 为
验证响应是否包含预期的 JSON 正文,以确认是否已添加工件。例如:
{"createdBy":"","createdOn":"2021-04-16T09:07:51+0000","modifiedBy":"", "modifiedOn":"2021-04-16T09:07:51+0000","id":"share-price","version":"1", "type":"AVRO","globalId":2,"state":"ENABLED","groupId":"my-group","contentId":2}{"createdBy":"","createdOn":"2021-04-16T09:07:51+0000","modifiedBy":"", "modifiedOn":"2021-04-16T09:07:51+0000","id":"share-price","version":"1", "type":"AVRO","globalId":2,"state":"ENABLED","groupId":"my-group","contentId":2}Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
添加工件时没有指定 version,因此会自动创建默认版本
1。 -
这是添加到 Service Registry 的第二个工件,因此全局 ID 和内容 ID 的值为
2。
-
添加工件时没有指定 version,因此会自动创建默认版本
使用 API 路径中的工件 ID 从 Service Registry 检索工件内容。在本例中,指定的 ID 是
share-price:curl -H "Authorization: Bearer $ACCESS_TOKEN" \ MY-REGISTRY-URL/apis/registry/v2/groups/my-group/artifacts/share-price
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" \ MY-REGISTRY-URL/apis/registry/v2/groups/my-group/artifacts/share-price {"type":"record","name":"price","namespace":"com.example", "fields":[{"name":"symbol","type":"string"},{"name":"price","type":"string"}]}Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2. 使用 Service Registry REST API 命令管理 schema 和 API 工件版本 复制链接链接已复制到粘贴板!
如果您在使用 Core Registry API v2 添加 schema 和 API 工件时没有指定工件版本,Service Registry 会自动生成一个版本。创建新工件时的默认版本为 1。
Service Registry 还支持自定义版本控制,您可以在其中将 X-Registry-Version HTTP 请求标头用作字符串来指定版本。指定自定义版本值会覆盖在创建或更新工件时通常会分配的默认版本。然后,您可以在执行需要版本的 REST API 操作时使用此版本值。
本节展示了一个简单的基于 curl 的示例,它使用 Core Registry API v2 在 Service Registry 中添加和检索自定义 Apache Avro 模式版本。您可以指定自定义版本来添加或更新工件,或添加工件版本。
先决条件
- Service Registry 已在您的环境中安装并运行。
流程
使用
/groups/{group}/artifacts操作在 registry 中添加工件版本。以下示例curl命令为共享价格应用程序添加一个简单的工件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
这个示例添加了一个 Avro 模式工件,工件 ID 为
my-share-price和1.1.1版本。如果没有指定版本,Service Registry 会自动生成默认版本1。 -
MY-REGISTRY-URL是部署 Service Registry 的主机名。例如:my-cluster-service-registry-myproject.example.com。 -
本例指定 API 路径中的
my-group组 ID。如果没有指定唯一组 ID,则必须在 API 路径中指定../groups/default。
-
这个示例添加了一个 Avro 模式工件,工件 ID 为
验证响应是否包含预期的 JSON 正文,以确认是否已添加了自定义工件版本。例如:
{"createdBy":"","createdOn":"2021-04-16T10:51:43+0000","modifiedBy":"", "modifiedOn":"2021-04-16T10:51:43+0000","id":"my-share-price","version":"1.1.1", "type":"AVRO","globalId":3,"state":"ENABLED","groupId":"my-group","contentId":3}{"createdBy":"","createdOn":"2021-04-16T10:51:43+0000","modifiedBy":"", "modifiedOn":"2021-04-16T10:51:43+0000","id":"my-share-price","version":"1.1.1", "type":"AVRO","globalId":3,"state":"ENABLED","groupId":"my-group","contentId":3}Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
在添加工件时,指定了
1.1.1的自定义版本。 -
这是添加到 registry 中的第三个工件,因此全局 ID 和内容 ID 的值为
3。
-
在添加工件时,指定了
使用 API 路径中的工件 ID 和版本从 registry 检索工件内容。在本例中,指定的 ID 是
my-share-price,版本为1.1.1:curl -H "Authorization: Bearer $ACCESS_TOKEN" \ MY-REGISTRY-URL/apis/registry/v2/groups/my-group/artifacts/my-share-price/versions/1.1.1
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" \ MY-REGISTRY-URL/apis/registry/v2/groups/my-group/artifacts/my-share-price/versions/1.1.1 {"type":"record","name":"price","namespace":"com.example", "fields":[{"name":"symbol","type":"string"},{"name":"price","type":"string"}]}Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3. 使用 Service Registry REST API 命令管理 schema 和 API 工件引用 复制链接链接已复制到粘贴板!
Service Registry 工件类型,如 Apache Avro、Protobuf 和 JSON Schema 可以包含从一个 工件文件到另一个工件文件的工件引用。您可以通过定义可重复使用的模式和 API 工件来创建参与,然后从多个位置引用它们。
本节展示了一个简单的基于 curl 的示例,它使用 Core Registry API v2 添加和检索对 Service Registry 中简单 Avro 模式工件的工件引用。
本例首先创建一个名为 ItemId 的模式工件:
slirpId 模式
然后,本例创建一个名为 Item 的模式工件,其中包含对嵌套的 ItemId 工件的引用。
带有嵌套 ItemId 模式的项目模式
先决条件
- Service Registry 已在您的环境中安装并运行。
流程
添加您要使用
/groups/{group}/artifacts操作创建嵌套工件引用的ItemId模式工件:curl -X POST MY-REGISTRY-URL/apis/registry/v2/groups/my-group/artifacts \ -H "Content-Type: application/json; artifactType=AVRO" \ -H "X-Registry-ArtifactId: ItemId" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --data '{"namespace": "com.example.common", "type": "record", "name": "ItemId", "fields":[{"name":"id", "type":"int"}]}'$ curl -X POST MY-REGISTRY-URL/apis/registry/v2/groups/my-group/artifacts \ -H "Content-Type: application/json; artifactType=AVRO" \ -H "X-Registry-ArtifactId: ItemId" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --data '{"namespace": "com.example.common", "type": "record", "name": "ItemId", "fields":[{"name":"id", "type":"int"}]}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
这个示例添加了一个 Avro 模式工件,工件 ID 为 192.168.0.1
Id。如果您没有指定唯一的工件 ID,Service Registry 将自动作为 UUID 生成一个。 -
MY-REGISTRY-URL是部署 Service Registry 的主机名。例如:my-cluster-service-registry-myproject.example.com。 -
本例指定 API 路径中的
my-group组 ID。如果没有指定唯一组 ID,则必须在 API 路径中指定../groups/default。
-
这个示例添加了一个 Avro 模式工件,工件 ID 为 192.168.0.1
验证响应是否包含预期的 JSON 正文,以确认是否已添加工件。例如:
{"name":"ItemId","createdBy":"","createdOn":"2022-04-14T10:50:09+0000","modifiedBy":"","modifiedOn":"2022-04-14T10:50:09+0000","id":"ItemId","version":"1","type":"AVRO","globalId":1,"state":"ENABLED","groupId":"my-group","contentId":1,"references":[]}{"name":"ItemId","createdBy":"","createdOn":"2022-04-14T10:50:09+0000","modifiedBy":"","modifiedOn":"2022-04-14T10:50:09+0000","id":"ItemId","version":"1","type":"AVRO","globalId":1,"state":"ENABLED","groupId":"my-group","contentId":1,"references":[]}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加
Item模式工件,它包括使用/groups/{group}/artifacts操作的到ItemId模式的工作引用:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
对于工件引用,您必须指定
application/create.extended+json的自定义内容类型,该类型扩展了application/json内容类型。
-
对于工件引用,您必须指定
验证响应是否包含预期的 JSON 正文,以确认是否使用引用创建工件。例如:
{"name":"Item","createdBy":"","createdOn":"2022-04-14T11:52:15+0000","modifiedBy":"","modifiedOn":"2022-04-14T11:52:15+0000","id":"Item","version":"1","type":"AVRO","globalId":2,"state":"ENABLED","groupId":"my-group","contentId":2, "references":[{"artifactId":"ItemId","groupId":"my-group","name":"ItemId","version":"1"}] }{"name":"Item","createdBy":"","createdOn":"2022-04-14T11:52:15+0000","modifiedBy":"","modifiedOn":"2022-04-14T11:52:15+0000","id":"Item","version":"1","type":"AVRO","globalId":2,"state":"ENABLED","groupId":"my-group","contentId":2, "references":[{"artifactId":"ItemId","groupId":"my-group","name":"ItemId","version":"1"}] }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过指定包含引用的工件的全局 ID,从 Service Registry 检索工件引用。在本例中,指定的全局 ID 是
2:curl -H "Authorization: Bearer $ACCESS_TOKEN" MY-REGISTRY-URL/apis/registry/v2/ids/globalIds/2/references
$ curl -H "Authorization: Bearer $ACCESS_TOKEN" MY-REGISTRY-URL/apis/registry/v2/ids/globalIds/2/referencesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证响应是否包含此工件引用的预期 JSON 正文。例如:
[{"groupId":"my-group","artifactId":"ItemId","version":"1","name":"com.example.common.ItemId"}][{"groupId":"my-group","artifactId":"ItemId","version":"1","name":"com.example.common.ItemId"}]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4. 使用 Service Registry REST API 命令导出和导入 registry 数据 复制链接链接已复制到粘贴板!
作为管理员,您可以使用 Core Registry API v2 从一个 Service Registry 实例导出数据,并导入到另一个 Service Registry 实例,以便在不同实例之间迁移数据。
本节展示了一个简单的基于 curl 的示例,它使用 Core Registry API v2 以 .zip 格式导出和导入现有数据,从一个 Service Registry 实例导出到另一个数据。Service Registry 实例中包含的所有工件数据都会在 .zip 文件中导出。
您只能导入从另一个 Service Registry 实例导出的 Service Registry 数据。
先决条件
- Service Registry 已在您的环境中安装并运行。
Service Registry 实例已创建:
- 要从中导出数据的源实例,至少包含一个模式或 API 工件。
- 要将数据导入到的目标实例为空,以保留唯一的 ID。
流程
从现有源 Service Registry 实例导出 Service Registry 数据:
curl MY-REGISTRY-URL/apis/registry/v2/admin/export \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --output my-registry-data.zip
$ curl MY-REGISTRY-URL/apis/registry/v2/admin/export \ -H "Authorization: Bearer $ACCESS_TOKEN" \ --output my-registry-data.zipCopy to Clipboard Copied! Toggle word wrap Toggle overflow MY-REGISTRY-URL是部署源 Service Registry 的主机名。例如:my-cluster-source-registry-myproject.example.com。将 registry 数据导入到目标 Service Registry 实例中:
curl -X POST "MY-REGISTRY-URL/apis/registry/v2/admin/import" \ -H "Content-Type: application/zip" -H "Authorization: Bearer $ACCESS_TOKEN" \ --data-binary @my-registry-data.zip
$ curl -X POST "MY-REGISTRY-URL/apis/registry/v2/admin/import" \ -H "Content-Type: application/zip" -H "Authorization: Bearer $ACCESS_TOKEN" \ --data-binary @my-registry-data.zipCopy to Clipboard Copied! Toggle word wrap Toggle overflow MY-REGISTRY-URL是部署目标 Service Registry 的主机名。例如:my-cluster-target-registry-myproject.example.com。
第 5 章 使用 Maven 插件管理 Service Registry 内容 复制链接链接已复制到粘贴板!
在开发客户端应用程序时,您可以使用 Service Registry Maven 插件来管理存储在 Service Registry 中的 schema 和 API 工件:
先决条件
- Service Registry 已在您的环境中安装并运行。
- 在您的环境中安装并配置 Apache Maven。
5.1. 使用 Maven 插件添加 schema 和 API 工件 复制链接链接已复制到粘贴板!
Maven 插件的最常见用例是在客户端应用程序构建期间添加工件。您可以使用 寄存器 执行目标来完成此操作。
先决条件
- 您已为您的客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven 文档。
流程
更新 Maven
pom.xml文件,以使用apicurio-registry-maven-plugin注册工件。以下示例演示了注册 Apache Avro 和 GraphQL 模式:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
mvn package命令构建 Maven 项目。
5.2. 使用 Maven 插件下载模式和 API 工件 复制链接链接已复制到粘贴板!
您可以使用 Maven 插件从 Service Registry 下载工件。例如,当从注册的架构生成代码时,这通常很有用。
先决条件
- 您已为您的客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven 文档。
流程
更新 Maven
pom.xml文件,以使用apicurio-registry-maven-plugin下载工件。以下示例显示了下载 Apache Avro 和 GraphQL 模式。Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
mvn package命令构建 Maven 项目。
5.3. 使用 Maven 插件测试模式和 API 工件 复制链接链接已复制到粘贴板!
您可能希望验证工件是否可以注册,而无需实际进行任何更改。当在 Service Registry 中配置规则时,这通常很有用。如果工件内容违反了任何配置的规则,测试工件会导致失败。
使用 Maven 插件测试工件时,即使工件通过测试,也不会将内容添加到 Service Registry 中。
先决条件
- 您已为您的客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven 文档。
流程
更新 Maven
pom.xml文件,以使用apicurio-registry-maven-plugin测试工件。以下示例显示了测试 Apache Avro 模式:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
mvn package命令构建 Maven 项目。
5.4. 使用 Service Registry Maven 插件手动添加工件引用 复制链接链接已复制到粘贴板!
Service Registry 工件类型,如 Apache Avro、Google Protobuf 和 JSON Schema 可以包括从一个 工件文件到另一个工件文件的工件引用。您可以通过定义可重复使用的模式或 API 工件来创建参与,然后从工件引用中的多个位置引用它们。
本节展示了一个简单的示例,它使用 Service Registry Maven 插件手动注册存储在 Service Registry 中的简单 Avro schema 工件引用。本例假定已在 Service Registry 中创建了以下 Exchange 模式工件:
Exchange 模式
然后,创建一个 TradeKey 模式工件,其中包含对嵌套 Exchange 模式工件的引用:
TradeKey 模式,带有嵌套对 Exchange schema 的引用
先决条件
- 您已为您的客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven 文档。
-
引用的
Exchange模式工件已在 Service Registry 中创建。
流程
更新 Maven
pom.xml文件,以使用apicurio-registry-maven-plugin注册TradeKey模式,其中包括对Exchange模式的嵌套引用,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
mvn package命令构建 Maven 项目。
5.5. 使用 Service Registry Maven 插件自动添加工件引用 复制链接链接已复制到粘贴板!
Service Registry 工件类型,如 Apache Avro、Google Protobuf 和 JSON Schema 可以包括从一个 工件文件到另一个工件文件的工件引用。您可以通过定义可重复使用的模式或 API 工件来创建参与,然后从工件引用中的多个位置引用它们。
您可以指定单个工件并配置 Service Registry Maven 插件,以自动检测同一目录中对工件的所有引用,并自动注册这些引用。
本节展示了使用 Maven 插件注册 Avro 模式的简单示例,并自动检测并注册对简单 schema 工件引用。本例假定父 TradeKey 工件和嵌套 Exchange 模式工件在同一目录中都可用:
TradeKey 模式,带有嵌套对 Exchange schema 的引用
Exchange 模式
先决条件
- 您已为您的客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven 文档。
-
TradeKey模式工件和嵌套Exchange模式工件文件都位于同一目录中。
流程
更新 Maven
pom.xml文件,以使用apicurio-registry-maven-plugin注册TradeKey模式,其中包括对Exchange模式的嵌套引用,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
mvn package命令构建 Maven 项目。
第 6 章 使用 Java 客户端管理 Service Registry 内容 复制链接链接已复制到粘贴板!
您可以编写 Service Registry Java 客户端应用程序,并使用它来管理存储在 Service Registry 中的工件:
6.1. Service Registry Java 客户端 复制链接链接已复制到粘贴板!
您可以使用 Java 客户端应用程序管理存储在 Service Registry 中的工件。您可以使用 Service Registry Java 客户端类创建、读取、更新或删除工件。您还可以使用 Service Registry Java 客户端来执行管理员功能,如管理全局规则或导入和导出 Service Registry 数据。
您可以通过在 Apache Maven 项目中添加正确的依赖项来访问 Service Registry Java 客户端。如需了解更多详细信息,请参阅 第 6.2 节 “编写 Service Registry Java 客户端应用程序”。
Service Registry 客户端使用 JDK 提供的 HTTP 客户端来实现,您可以根据需要进行自定义。例如,您可以添加自定义标头或为传输层安全(TLS)身份验证启用配置选项。如需了解更多详细信息,请参阅 第 6.3 节 “Service Registry Java 客户端配置”。
6.2. 编写 Service Registry Java 客户端应用程序 复制链接链接已复制到粘贴板!
您可以使用 Service Registry Java 客户端类编写 Java 客户端应用程序来管理存储在 Service Registry 中的工件。
先决条件
- Service Registry 已在您的环境中安装并运行。
- 您已为 Java 客户端应用程序创建了 Maven 项目。如需了解更多详细信息,请参阅 Apache Maven。
流程
在您的 Maven 项目中添加以下依赖项:
<dependency> <groupId>io.apicurio</groupId> <artifactId>apicurio-registry-client</artifactId> <version>${apicurio-registry.version}</version> </dependency><dependency> <groupId>io.apicurio</groupId> <artifactId>apicurio-registry-client</artifactId> <version>${apicurio-registry.version}</version> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 Service Registry 客户端,如下所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
如果您指定了
https://my-registry.my-domain.com的示例 Service Registry URL,客户端将自动附加/apis/registry/v2。 - 有关创建 Service Registry 客户端的更多信息,请参阅下一部分中的 Java 客户端配置。
-
如果您指定了
创建客户端时,您可以使用客户端中的 Service Registry REST API 中的所有操作。如需了解更多详细信息,请参阅 Apicurio Registry REST API 文档。
6.3. Service Registry Java 客户端配置 复制链接链接已复制到粘贴板!
Service Registry Java 客户端根据客户端工厂包括以下配置选项:
| 选项 | 描述 | 参数 |
|---|---|---|
| 普通客户端 | 用于与正在运行的 Service Registry 实例交互的基本 REST 客户端。 |
|
| 带有自定义配置的客户端 | 使用用户提供的配置进行 Service Registry 客户端。 |
|
| 带有自定义配置和身份验证的客户端 | 接受包含自定义配置的映射的 Service Registry 客户端。例如,这对于在调用中添加自定义标头非常有用。您还必须提供身份验证服务器来验证请求。 |
|
自定义标头配置
要配置自定义标头,您必须将 apicurio.registry.request.headers 前缀添加到 configs map 键中。例如,配置映射键为 apicurio.registry.request.headers.Authorization,值为 Basic: YWxhZGRpbjpvcGVuc2VzYW1 将 Authorization 标头设置相同的值。
TLS 配置选项
您可以使用以下属性为 Service 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 信息 复制链接链接已复制到粘贴板!
Service Registry 为使用 Java 编写的 Kafka 生成者和消费者应用程序提供客户端序列化器/反序列化器(SerDes)。Kafka producer 应用程序使用序列化器来编码符合特定事件模式的消息。Kafka 消费者应用程序使用反序列化器根据特定的模式 ID 验证消息是否已序列化。这样可确保架构使用一致,有助于在运行时防止数据错误。
本章解释了如何在生成者和消费者客户端应用程序中使用 Kafka 客户端 SerDe :
先决条件
- 您已阅读 第 1 章 Service Registry 简介。
- 已安装 Service Registry。
您已创建了 Kafka producer 和消费者客户端应用程序。
有关 Kafka 客户端应用程序的详情,请参阅在 OpenShift 中部署和升级 AMQ Streams。
7.1. Kafka 客户端应用程序和 Service Registry 复制链接链接已复制到粘贴板!
Service Registry 将架构管理与客户端应用程序配置分离。您可以通过在客户端代码中指定 URL 来启用 Java 客户端应用程序使用 Service Registry 中的模式。
您可以将模式存储在 Service Registry 中,以序列化和反序列化消息,这些消息从客户端应用程序引用,以确保它们发送和接收的信息与这些模式兼容。Kafka 客户端应用程序可以在运行时从 Service Registry 中推送或拉取其模式。
模式可以演进,因此您可以在 Service Registry 中定义规则,以确保架构更改有效,且不会破坏应用程序使用的早期版本。Service Registry 通过将修改的模式与以前的模式进行比较来检查兼容性。
Service Registry 模式技术
Service Registry 为 schema 技术提供模式 registry 支持,例如:
- avro
- protobuf
- JSON Schema
这些模式技术可通过 Service Registry 提供的 Kafka 客户端序列化器/反序列化器(SerDes)服务来使用。Service Registry 提供的 SerDes 类的成熟度和使用可能会有所不同。以下章节提供了有关每种架构类型的更多详情。
producer 模式配置
生成者客户端应用程序使用序列化器将发送到特定代理主题的消息放入正确的数据格式。
启用制作者使用 Service Registry 进行序列化:
- 使用 Service Registry 定义并注册您的模式 (如果尚不存在)。
- Service Registry 的 URL
- Service Registry 序列化器用于消息
- 将 Kafka 信息映射到 Service Registry 中的模式工件的策略
- 在 Service Registry 中查找或注册用于序列化的模式的策略
注册模式后,当启动 Kafka 和 Service Registry 时,您可以访问 schema 来格式化发送到 Kafka 代理的信息。或者,根据配置,生产者可以在第一次使用时自动注册 schema。
如果模式已存在,您可以使用 registry REST API 根据 Service Registry 中定义的兼容性规则创建新版本。随着架构的演进,版本用于兼容性检查。组 ID、工件 ID 和版本代表标识模式的唯一元组。
消费者 schema 配置
消费者客户端应用程序使用反序列化器获取从特定代理主题使用的消息作为正确的数据格式。
启用消费者使用 Service Registry 进行反序列化化:
- 使用 Service Registry 定义并注册您的模式 (如果尚不存在)
- Service Registry 的 URL
- Service Registry 反序列化器用于信息
- 用于反序列化的输入数据流
使用全局 ID 检索模式
默认情况下,schema 由 deserializer 使用全局 ID 从 Service Registry 检索,该 ID 在被使用的消息中指定。架构全局 ID 可以位于消息标头或消息有效负载中,具体取决于制作者应用的配置。
当在消息有效负载中查找全局 ID 时,数据格式以 magic 字节开头,用作消费者的信号,后跟全局 ID,以及消息数据正常。例如:
...
# ...
[MAGIC_BYTE]
[GLOBAL_ID]
[MESSAGE DATA]
然后,当您启动 Kafka 和 Service Registry 时,您可以访问 schema 来格式化从 Kafka 代理主题接收的消息。
使用内容 ID 检索模式
或者,您可以将配置为根据内容 ID 从 Service Registry 检索模式,这是工件内容的唯一 ID。全局 ID 是工件版本的唯一 ID。
内容 ID 不唯一标识版本,但仅唯一标识版本内容。如果多个版本共享相同的内容,它们具有不同的全局 ID,但相同的内容 ID。confluent Schema Registry 默认使用内容 ID。
7.2. 在 Service Registry 中查找模式的策略 复制链接链接已复制到粘贴板!
Kafka 客户端序列化程序使用 lookup 策略 来确定在 Service Registry 中注册消息模式的工件 ID 和全局 ID。对于给定主题和消息,您可以使用 ArtifactReferenceResolverStrategy Java 接口的不同实现返回对 registry 中工件的引用。
每个策略的类都位于 io.apicurio.registry.serde.strategy 软件包中。Avro SerDes 的特定策略类位于 io.apicurio.registry.serde.avro.strategy 软件包中。默认策略是 TopicIdStrategy,它查找名称与 Kafka 主题接收信息相同的 Service Registry 工件。
示例
public ArtifactReference artifactReference(String topic, boolean isKey, T schema) {
return ArtifactReference.builder()
.groupId(null)
.artifactId(String.format("%s-%s", topic, isKey ? "key" : "value"))
.build();
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参数是消息序列化或反序列化的 schema。 -
返回的
ArtifactReference包含 schema 注册的工件 ID。
您使用的查找策略取决于如何和在哪里存储您的架构。例如,如果您具有不同的 Kafka 主题与相同的 Avro 消息类型,您可以使用一个策略来使用 记录 ID。
工件解析器策略
工件解析器策略提供了一种将 Kafka 主题和消息信息映射到 Service Registry 中的工件的方法。映射的常见惯例是,将 Kafka 主题名称与 键或 值 合并,具体取决于是否将序列化器用于 Kafka 消息键或值。
但是,您可以使用 Service Registry 提供的策略或创建一个实施 io.apicurio.registry.serde.strategy.ArtifactReferenceResolverStrategy 的自定义 Java 类来对映射使用替代约定。
返回对工件的引用的策略
Service Registry 提供以下策略,根据 ArtifactReferenceResolverStrategy 的实现返回对工件的引用:
RecordIdStrategy- 使用 schema 全名的 Avro 具体策略。
TopicRecordIdStrategy- 使用主题名称和架构全名的特定于 Avro 的策略。
TopicIdStrategy-
默认策略,它使用主题名和
key或value后缀。 SimpleTopicIdStrategy- 仅使用主题名称的简单策略。
DefaultSchemaResolver 接口
默认架构解析器找到并标识工件解析器策略中提供的工件引用下注册的架构的特定版本。每个工件的每个版本都有一个全局唯一标识符,可用于检索该工件的内容。这个全局 ID 包含在每个 Kafka 信息中,以便反序列化器可以从 Apicurio Registry 正确获取 schema。
默认架构解析器可以查找现有的工件版本,或者可以根据使用哪个策略来注册该工件版本。您还可以创建实施 io.apicurio.registry.resolver.SchemaResolver 的自定义 Java 类来提供自己的策略。但是,建议您使用 DefaultSchemaResolver 并指定配置属性。
配置 registry 查找选项
使用 DefaultSchemaResolver 时,您可以使用应用程序属性配置其行为。下表显示了一些常用的示例:
| 属性 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
|
| 指定序列化器是否在 registry 中查找相应组 ID 和工件 ID 的最新工件。 |
|
|
|
| 指示序列化器将指定的 ID 写入 Kafka,并指示反序列化器使用此 ID 查找模式。 | None |
|
|
| 指定序列化器是否在 registry 中创建工件。JSON 架构序列化器不支持此功能。 |
|
|
|
| 指定以毫秒为单位缓存全局 ID 的时间。如果没有配置,则每次都会获取全局 ID。 | None |
7.3. 在 Service Registry 中注册模式 复制链接链接已复制到粘贴板!
在以适当的格式(如 Apache Avro)定义了模式后,您可以将模式添加到 Service Registry 中。
您可以使用以下方法添加模式:
- Service Registry web 控制台
- 使用 Service Registry REST API 的 curl 命令
- Service Registry 提供的 Maven 插件
- 添加至客户端代码中的 schema 配置
在注册了 schema 之前,客户端应用程序无法使用 Service Registry。
Service Registry web 控制台
安装 Service Registry 后,您可以从 ui 端点连接到 web 控制台:
http://MY-REGISTRY-URL/ui
在控制台中,您可以添加、查看和配置模式。您还可以创建阻止将无效内容添加到 registry 的规则。
curl 命令示例
- 简单的 Avro 模式工件。
- 公开 Service Registry 的 OpenShift 路由名称。
Maven 插件示例
-
指定
register作为将架构工件上传到 registry 的执行目标。 -
使用
../apis/registry/v2端点指定 Service Registry URL。 - 指定 Service Registry 工件组 ID。
- 您可以使用指定的组 ID、工件 ID 和位置上传多个工件。
使用制作者客户端示例进行配置
- 您可以针对多个 URL 节点注册属性。
- 根据工件 ID 检查架构是否已存在。
7.4. 使用 Kafka 使用者客户端的模式 复制链接链接已复制到粘贴板!
这个步骤描述了如何将使用 Java 编写的 Kafka 使用者客户端配置为使用 Service Registry 中的模式。
先决条件
- 已安装 Service Registry
- 模式在 Service Registry 中注册
流程
使用 Service Registry 的 URL 配置客户端。例如:
String registryUrl = "https://registry.example.com/apis/registry/v2"; Properties props = new Properties(); props.putIfAbsent(SerdeConfig.REGISTRY_URL, registryUrl);
String registryUrl = "https://registry.example.com/apis/registry/v2"; Properties props = new Properties(); props.putIfAbsent(SerdeConfig.REGISTRY_URL, registryUrl);Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Service Registry 反序列化器配置客户端。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1.Service Registry 提供的反序列化器。
- 2.反序列化采用 Apache Avro JSON 格式。
7.5. 使用 Kafka producer 客户端的模式 复制链接链接已复制到粘贴板!
这个步骤描述了如何将使用 Java 编写的 Kafka producer 客户端配置为使用 Service Registry 的 schema。
先决条件
- 已安装 Service Registry
- 模式在 Service Registry 中注册
流程
使用 Service Registry 的 URL 配置客户端。例如:
String registryUrl = "https://registry.example.com/apis/registry/v2"; Properties props = new Properties(); props.putIfAbsent(SerdeConfig.REGISTRY_URL, registryUrl);
String registryUrl = "https://registry.example.com/apis/registry/v2"; Properties props = new Properties(); props.putIfAbsent(SerdeConfig.REGISTRY_URL, registryUrl);Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 serializer 配置客户端,以及策略以在 Service Registry 中查找 schema。例如:
props.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, "my-cluster-kafka-bootstrap:9092"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, AvroKafkaSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AvroKafkaSerializer.class.getName()); props.put(SerdeConfig.FIND_LATEST_ARTIFACT, Boolean.TRUE);
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 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1.Service Registry 提供的 message 键的序列化器。
- 2.Service Registry 提供的 message 值的序列化器。
- 3.查找架构的全局 ID 的 lookup 策略。
7.6. 使用 Kafka Streams 应用程序的模式 复制链接链接已复制到粘贴板!
这个步骤描述了如何配置使用 Java 编写的 Kafka Streams 客户端,以使用 Service Registry 中的 Apache Avro 模式。
先决条件
- 已安装 Service Registry
- 模式在 Service Registry 中注册
流程
使用 Service Registry URL 创建并配置 Java 客户端:
String registryUrl = "https://registry.example.com/apis/registry/v2"; RegistryService client = RegistryClient.cached(registryUrl);
String registryUrl = "https://registry.example.com/apis/registry/v2"; RegistryService client = RegistryClient.cached(registryUrl);Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置序列化器和反序列化器:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1.Service Registry 提供的 Avro serializer。
- 2.Service Registry 提供的 Avro deserializer。
- 3.配置 Service Registry URL 和 Avro 读取器以 Avro 格式进行反序列化化。
创建 Kafka Streams 客户端:
KStream<String, LogInput> input = builder.stream( INPUT_TOPIC, Consumed.with(Serdes.String(), logSerde) );KStream<String, LogInput> input = builder.stream( INPUT_TOPIC, Consumed.with(Serdes.String(), logSerde) );Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 8 章 在 Java 客户端中配置 Kafka 序列化器/反序列化器 复制链接链接已复制到粘贴板!
本章详细介绍了如何在生成者和消费者 Java 客户端应用程序中配置 Kafka SerDe:
先决条件
8.1. 客户端应用程序中的 Service Registry 序列化器/反序列化配置 复制链接链接已复制到粘贴板!
您可以使用本节中显示的示例常量配置特定的客户端序列化器/反序列化器(SerDe)服务和模式查找策略。另外,您可以在文件或实例中配置对应的 Service Registry 应用程序属性。
以下小节演示了常用的 SerDe 常量和配置选项的示例。
配置 SerDe 服务
public class SerdeConfig {
public static final String REGISTRY_URL = "apicurio.registry.url";
public static final String ID_HANDLER = "apicurio.registry.id-handler";
public static final String ENABLE_CONFLUENT_ID_HANDLER = "apicurio.registry.as-confluent";
public class SerdeConfig {
public static final String REGISTRY_URL = "apicurio.registry.url";
public static final String ID_HANDLER = "apicurio.registry.id-handler";
public static final String ENABLE_CONFLUENT_ID_HANDLER = "apicurio.registry.as-confluent";
- Service Registry 所需的 URL。
-
扩展 ID 处理以支持其他 ID 格式,并使其与 Service Registry SerDe 服务兼容。例如,将默认 ID 格式从
Long改为Integer支持 Confluent ID 格式。 -
简化了对一致性 ID 的处理。如果设置为
true,则使用Integer用于全局 ID 查找。设置不应与ID_HANDLER选项一起使用。
配置 SerDe 查找策略
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";
...
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";
...
- 实施工件解析器策略的 Java 类,并在 Kafka SerDe 和工件 ID 之间映射。默认为主题 ID 策略。这仅由 serializer 类使用。
-
实施架构解析器的 Java 类。默认为
DefaultSchemaResolver。这由序列化器和反序列化类使用。
配置 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";
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";
- 与 Service Registry Kafka 转换器搭配使用所需的序列化器。
- 与 Service Registry Kafka 转换器搭配使用所需的反序列化器。
配置不同模式类型
有关如何为不同模式技术配置 SerDe 的详情,请参考以下内容:
8.2. Service Registry serializer/deserializer 配置属性 复制链接链接已复制到粘贴板!
本节提供有关 Service Registry Kafka serializers/deserializers (SerDes)的 Java 配置属性的参考信息。
SchemaResolver 接口
Service Registry SerDes 基于 SchemaResolver 接口,它提取对 registry 的访问,并对所有支持的格式的 SerDes 类应用相同的查找逻辑。
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
|
由序列化器和反序列化器使用。实施 | 字符串 |
|
建议使用 DefaultSchemaResolver,并为大多数用例提供有用的功能。对于一些高级用例,您可以使用 SchemaResolver 的自定义实现。
DefaultSchemaResolver 类
您可以使用 DefaultSchemaResolver 来配置功能,例如:
- 访问 registry API
- 如何在 registry 中查找工件
- 如何将工件信息写入和读取 Kafka 中的工件信息
- 反序列化器的回退选项
配置 registry API 访问选项
DefaultSchemaResolver 提供以下属性来配置对核心 registry API 的访问:
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
| 由序列化器和反序列化器使用。用于访问 registry API 的 URL。 |
| None |
|
|
| 由序列化器和反序列化器使用。身份验证服务的 URL。使用 OAuth 客户端凭据流访问安全 registry 时是必需的。 |
| None |
|
|
|
由序列化器和反序列化器使用。令牌端点的 URL。在访问安全 registry 时,没有指定 |
| None |
|
|
| 由序列化器和反序列化器使用。访问身份验证服务的域。使用 OAuth 客户端凭据流访问安全 registry 时是必需的。 |
| None |
|
|
| 由序列化器和反序列化器使用。用于访问身份验证服务的客户端 ID。使用 OAuth 客户端凭据流访问安全 registry 时是必需的。 |
| None |
|
|
| 由序列化器和反序列化器使用。用于访问身份验证服务的客户端机密。使用 OAuth 客户端凭据流访问安全 registry 时是必需的。 |
| None |
|
|
| 由序列化器和反序列化器使用。访问 registry 的用户名。使用 HTTP 基本身份验证访问安全 registry 时是必需的。 |
| None |
|
|
| 由序列化器和反序列化器使用。访问 registry 的密码。使用 HTTP 基本身份验证访问安全 registry 时是必需的。 |
| None |
配置 registry 查找选项
DefaultSchemaResolver 使用以下属性配置如何在 Service Registry 中查找工件。
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
|
仅由序列化器使用。实现 |
|
|
|
|
|
仅由序列化器使用。设置用于查询或创建工件的 |
| None |
|
|
|
仅由序列化器使用。设置用于查询或创建工件的 |
| None |
|
|
|
仅由序列化器使用。设置用于查询或创建工件的工件版本。覆盖 |
| None |
|
|
| 仅由序列化器使用。指定序列化器是否尝试在 registry 中查找相应组 ID 和工件 ID 的最新工件。 |
|
|
|
|
| 仅由序列化器使用。指定序列化器是否在 registry 中创建工件。JSON 架构序列化器不支持此功能。 |
|
|
|
|
|
仅由序列化器使用。在创建工件时出现冲突时配置客户端的行为,因为工件已存在。可用值为 |
|
|
|
|
| 由序列化器和反序列化器使用。指定在自动偏移前缓存工件的时间(毫秒)。如果设置为零,则每次都会获取工件。 |
|
|
|
|
| 由序列化器和反序列化器使用。如果无法从 Registry 检索模式,它可能会重试多次。此配置选项控制重试尝试之间的延迟(毫秒)。 |
|
|
|
|
| 由序列化器和反序列化器使用。如果无法从 Registry 检索模式,它可能会重试多次。这个配置选项控制重试尝试次数。 |
|
|
|
|
|
由序列化器和反序列化器使用。将配置为使用指定的 |
|
|
配置 Kafka 中的读/写 registry 工件
DefaultSchemaResolver 使用以下属性来配置工件信息如何从 Kafka 写入和读取。
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
| 由序列化器和反序列化器使用。将工件标识符配置为读/写工件标识符到 Kafka 消息标头,而不是在消息有效负载中。 |
|
|
|
|
|
由序列化器和反序列化器使用。实现 |
|
|
|
|
|
由序列化器和反序列化器使用。实施 |
|
|
|
|
|
由序列化器和反序列化器使用。启用旧兼容 |
|
|
配置反序列化器回退选项
DefaultSchemaResolver 使用下列属性来为所有反序列化器配置回退提供程序。
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
|
仅供反序列化器使用。设置 |
|
|
DefaultFallbackArtifactProvider 使用以下属性来配置反序列化器回退选项:
| 常数 | 属性 | 描述 | 类型 | 默认 |
|---|---|---|---|---|
|
|
|
仅供反序列化器使用。设置用作回退的 |
| None |
|
|
|
仅供反序列化器使用。设置用作回退的 |
| None |
|
|
| 仅供反序列化器使用。设置用于解析用于反序列化的工件的回退版本。 |
| None |
其他资源
- 如需了解更多详细信息,请参阅 SerdeConfig Java 类。
-
您可以将应用程序属性配置为 Java 系统属性,或者在 Quarkus
application.properties文件中包含它们。如需了解更多详细信息,请参阅 Quarkus 文档。
8.3. 如何配置不同的客户端序列化器/反序列化类型 复制链接链接已复制到粘贴板!
当在 Kafka 客户端应用程序中使用模式时,您必须根据您的用例选择要使用的特定模式类型。Service Registry 为 Apache Avro、JSON Schema 和 Google Protobuf 提供 SerDe Java 类。以下小节解释了如何配置 Kafka 应用程序以使用每种类型。
您还可以使用 Kafka 实现自定义序列化器和反序列化类,并使用 Service Registry REST Java 客户端利用 Service Registry 功能。
serializers/deserializers 的 Kafka 应用程序配置
使用 Kafka 应用程序中的 Service Registry 提供的 SerDe 类涉及设置正确的配置属性。以下简单的 Avro 示例演示了如何在 Kafka producer 应用程序中配置序列化器以及如何在 Kafka 消费者应用程序中配置反序列化器。
Kafka producer 中的序列化器配置示例
Kafka 使用者中的反序列化配置示例
8.3.1. 使用 Service Registry 配置 Avro SerDes 复制链接链接已复制到粘贴板!
本主题解释了如何将 Kafka 客户端序列化器和反序列化器(SerDes)类用于 Apache Avro。
Service Registry 为 Avro 提供以下 Kafka 客户端 SerDes 类:
-
io.apicurio.registry.serde.avro.AvroKafkaSerializer -
io.apicurio.registry.serde.avro.AvroKafkaDeserializer
配置 Avro serializer
您可以使用以下方法配置 Avro serializer 类:
- Service Registry URL
- 工件解析器策略
- ID 位置
- ID 编码
- Avro datum 供应商
- Avro 编码
ID 位置
序列化器将唯一模式 ID 作为 Kafka 消息的一部分传递,以便消费者可以使用正确的模式进行反序列化。ID 可以在消息有效负载或消息标头中。默认位置是消息有效负载。要在消息标头中发送 ID,请设置以下配置属性:
props.putIfAbsent(SerdeConfig.ENABLE_HEADERS, "true")
props.putIfAbsent(SerdeConfig.ENABLE_HEADERS, "true")
属性名称为 apicurio.registry.headers.enabled。
ID 编码
您可以在 Kafka 消息正文中传递模式 ID 时如何对其进行编码。将 apicurio.registry.id-handler 配置属性设置为实现 io.apicurio.registry.serde.IdHandler 接口的类。Service Registry 提供以下实现:
-
io.apicurio.registry.serde.DefaultIdHandler:将 ID 存储为 8 字节长 -
io.apicurio.registry.serde.Legacy4ByteIdHandler: 存储 ID 为 4 字节整数
Service Registry 代表模式 ID 长,但出于旧原因,或者出于与其他 registry 或 SerDe 类兼容,您可能需要在发送 ID 时使用 4 字节。
Avro datum 供应商
Avro 提供不同的 datum writers 和 readers 来写入和读取数据。Service Registry 支持三种不同类型的:
- 通用
- 特定
- reflect
Service 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 类,以匹配序列化器的以下配置设置:
- Service Registry URL
- ID 编码
- Avro datum 供应商
- Avro 编码
有关这些配置选项,请参阅序列化器部分。属性名称和值相同。
配置反序列化器时不需要以下选项:
- 工件解析器策略
- ID 位置
deserializer 类可以决定消息中的这些选项值。不需要该策略,因为序列化器负责发送 ID 作为消息的一部分。
ID 位置通过在消息有效负载开始时检查 magic 字节来确定。如果找到该字节,则使用配置的处理程序从消息有效负载中读取 ID。如果没有找到 magic 字节,则从消息标头中读取 ID。
Avro SerDes 和工件引用
使用 Avro 消息和带有嵌套记录的模式时,每个嵌套记录会注册一个新的工件。例如,以下 TradeKey 模式包含一个嵌套的 Exchange 模式:
带有嵌套交换模式的 TradeKey 模式
Exchange 模式
将这些模式与 Avro SerDes 搭配使用时,会在 Service Registry 中创建两个工件,一个用于 TradeKey 模式,一个用于 Exchange 模式。每当使用 TradeKey 模式的消息被序列化或反序列化时,检索两个模式,允许您将定义分成不同的文件中。
8.3.2. 使用 Service Registry 配置 JSON 架构 SerDe 复制链接链接已复制到粘贴板!
本主题解释了如何将 Kafka 客户端序列化器和反序列化器(SerDes)类用于 JSON Schema。
Service Registry 为 JSON 架构提供以下 Kafka 客户端 SerDes 类:
-
io.apicurio.registry.serde.jsonschema.JsonSchemaKafkaSerializer -
io.apicurio.registry.serde.jsonschema.JsonSchemaKafkaDeserializer
与 Apache Avro 不同,JSON 架构不是序列化技术,而是是一个验证技术。因此,JSON 架构的配置选项非常不同。例如,没有编码选项,因为数据始终编码为 JSON。
配置 JSON 架构序列化器
您可以配置 JSON 架构序列化程序类,如下所示:
- Service Registry URL
- 工件解析器策略
- 模式验证
唯一的非标准配置属性是 JSON Schema 验证,该验证默认是启用的。您可以通过将 apicurio.registry.serde.validation-enabled 设置为 "false" 来禁用此功能。例如:
props.putIfAbsent(SerdeConfig.VALIDATION_ENABLED, Boolean.FALSE)
props.putIfAbsent(SerdeConfig.VALIDATION_ENABLED, Boolean.FALSE)
配置 JSON 架构反序列化器
您可以配置 JSON 架构反序列化器类,如下所示:
- Service Registry URL
- 模式验证
- 解码数据的类
您必须提供 Service Registry 的位置,以便载入 schema。其他配置是可选的。
只有序列化器在 Kafka 消息中传递全局 ID 时,才会正常工作,这仅在 serializer 中启用验证时才会生效。
JSON 架构 SerDes 和工件引用
JSON 架构 SerDes 无法从消息有效负载中发现 schema,因此必须事先注册架构工件,这也会应用工件引用。
根据架构的内容,如果 $ref 值是一个 URL,SerDes 会尝试使用该 URL 解析引用的模式,然后验证可以正常工作,针对主模式验证数据,并根据嵌套架构验证嵌套值。还实现了在 Service Registry 中引用工件的支持。
例如,以下 evince .json 模式引用 city.json 模式:
带对 city.json 模式的引用的 evince.json 模式
city.json schema
在本例中,给定者有一个城市。在 Service Registry 中,使用名称 city.json 创建对 city 工件的引用的 kiosk 工件。在 SerDes 中,当获取了 slirp 模式时,也会获取 city 模式,因为它是从 站 模式引用的。在序列化/反序列化数据时,参考名称用于解析嵌套的模式,允许针对 kiosk 模式和嵌套的 city 模式进行验证。
8.3.3. 使用 Service Registry 配置 Protobuf SerDes 复制链接链接已复制到粘贴板!
本节介绍如何将 Kafka 客户端序列化器和反序列化器(SerDes)类用于 Google Protobuf。
Service Registry 为 Protobuf 提供以下 Kafka 客户端 SerDes 类:
-
io.apicurio.registry.serde.protobuf.ProtobufKafkaSerializer -
io.apicurio.registry.serde.protobuf.ProtobufKafkaDeserializer
配置 Protobuf serializer
您可以配置 Protobuf serializer 类,如下所示:
- Service Registry URL
- 工件解析器策略
- ID 位置
- ID 编码
- 模式验证
有关这些配置选项的详情,请查看以下部分:
配置 Protobuf 反序列化器
您必须配置 Protobuf deserializer 类,以匹配序列化器中的以下配置设置:
- Service Registry URL
- ID 编码
配置属性名称和值与序列化器相同。
配置反序列化器时不需要以下选项:
- 工件解析器策略
- ID 位置
deserializer 类可以决定消息中的这些选项值。不需要该策略,因为序列化器负责发送 ID 作为消息的一部分。
ID 位置通过在消息有效负载开始时检查 magic 字节来确定。如果找到该字节,则使用配置的处理程序从消息有效负载中读取 ID。如果没有找到 magic 字节,则从消息标头中读取 ID。
Protobuf deserializer 不会反序列化到确切的 Protobuf 消息实现,而是切换到 DynamicMessage 实例。否则,没有适当的 API。
protobuf SerDes 和工件引用
当使用带有 import 语句的复杂 Protobuf 消息时,导入的 Protobuf 消息将存储在 Service Registry 中作为单独的工件。然后,当 Service Registry 获取检查 Protobuf 消息的主模式时,也会检索引用的方案,以便可以检查和序列化完整的消息 schema。
例如,下表_info.proto 模式文件包含导入的 mode.proto schema 文件:
带有导入的 .mode.proto 文件的 table_info.proto 文件
mode.proto 文件
在本例中,两个 Protobuf 工件存储在 Service Registry 中,一个用于 TableInfo,一个用于 Mode。但是,因为 Mode 是 TableInfo 的一部分,因此每当获取 TableInfo 以检查 SerDes 中的消息时,Mode 也作为 TableInfo 引用的工件返回。
第 9 章 Service Registry 工件参考 复制链接链接已复制到粘贴板!
本章提供了存储在 Service Registry 中支持的工件类型、状态和元数据的参考信息。
9.1. Service Registry 工件类型 复制链接链接已复制到粘贴板!
您可以在 Service Registry 中存储和管理各种模式和 API 工件类型。
| 类型 | 描述 |
|---|---|
|
| AsyncAPI 规格 |
|
| Apache Avro 模式 |
|
| GraphQL schema |
|
| JSON Schema |
|
| Apache Kafka Connect 模式 |
|
| OpenAPI 规格 |
|
| Google 协议缓冲模式 |
|
| Web 服务定义语言 |
|
| 可扩展标记语言 |
|
| XML 架构定义 |
9.2. Service Registry 工件状态 复制链接链接已复制到粘贴板!
Service Registry 中的有效工件状态为 ENABLED、DISABLED 和 DEPRECATED。
| 状态 | 描述 |
|---|---|
|
| 基本状态,所有操作都可用。 |
|
| 工件及其元数据可以使用 Service Registry web 控制台查看并可搜索,但其内容不能被任何客户端获取。 |
|
| 工件完全可用,但在获取工件内容时都会将标头添加到 REST API 响应中。Service Registry Rest Client 也会在它看到已弃用的内容时记录警告。 |
9.3. Service Registry 工件元数据 复制链接链接已复制到粘贴板!
当工件添加到 Service Registry 时,一组元数据属性会与工件内容一起存储。此元数据由一组生成的只读属性组成,以及您可以设置的一些属性。
| 属性 | 类型 |
|---|---|
|
| 整数 |
|
| 字符串 |
|
| date |
|
| 整数 |
|
| 字符串 |
|
| 字符串 |
|
| 字符串 |
|
| date |
|
| ArtifactReference 的数组 |
|
| ArtifactType |
|
| 整数 |
| 属性 | 类型 |
|---|---|
|
| 字符串 |
|
| 字符串数组 |
|
| 字符串 |
|
| Map |
|
| ArtifactState |
更新工件元数据
- 您可以使用 Service Registry REST API 使用元数据端点更新可编辑的属性集合。
-
您只能使用
stateconversion API 编辑 state 属性。例如,您可以将工件标记为已弃用或禁用。
第 10 章 Service Registry 内容规则引用 复制链接链接已复制到粘贴板!
本章提供有关支持的内容规则类型的参考信息,它们对工件类型的支持级别,以及特定于工件和全局规则的优先级顺序。
10.1. Service Registry 内容规则类型 复制链接链接已复制到粘贴板!
您可以指定 VALIDITY、COMPATIBILITY 和 INTEGRITY 规则类型,以管理 Service Registry 中的内容演进。这些规则类型适用于全局规则和特定于工件的规则。
| 类型 | 描述 |
|---|---|
|
| 在将内容添加到 Service Registry 之前验证内容。此规则可能的配置值如下:
|
|
|
在更新工件时强制实施兼容性级别(例如,选择
|
|
| 在创建或更新工件时强制实施工件引用完整性。启用并配置此规则,以确保任何提供的工件引用都正确。此规则可能的配置值如下:
|
10.2. Service Registry 内容规则成熟度 复制链接链接已复制到粘贴板!
并非所有内容规则都针对 Service Registry 支持的每个工件类型完全实现。下表显示了每个规则和工件类型的当前成熟度等级:
| 工件类型 | 有效规则 | 兼容性规则 | 完整性规则 |
|---|---|---|---|
| avro | full | full | full |
| protobuf | full | full | full |
| JSON 架构 | full | full | 不支持映射检测 |
| OpenAPI | full | None | full |
| asyncAPI | 仅限语法 | None | full |
| GraphQL | 仅限语法 | None | 不支持映射检测 |
| Kafka Connect | 仅限语法 | None | 不支持映射检测 |
| WSDL | full | None | 不支持映射检测 |
| XML | full | None | 不支持映射检测 |
| XSD | full | None | 不支持映射检测 |
10.3. Service Registry 内容规则优先级 复制链接链接已复制到粘贴板!
当您添加或更新工件时,Service Registry 应用规则来检查工件内容的有效性、兼容性或完整性。配置特定于工件的规则会覆盖对等配置的全局规则,如下表所示。
| 特定于工件的规则 | 全局规则 | 应用到此工件的规则 | 用于其他工件的全局规则? |
|---|---|---|---|
| Enabled | Enabled | 特定于工件 | 是 |
| Disabled | Enabled | 全局 | 是 |
| Disabled | Disabled | None | 否 |
| 启用,设置为 None | Enabled | None | 是 |
| Disabled | 启用,设置为 None | None | 否 |
附录 A. 使用您的订阅 复制链接链接已复制到粘贴板!
Service Registry 通过软件订阅提供。要管理您的订阅,请访问红帽客户门户中的帐户。
访问您的帐户
- 转至 access.redhat.com。
- 如果您还没有帐户,请创建一个帐户。
- 登录到您的帐户。
激活订阅
- 转至 access.redhat.com。
- 导航到 My Subscriptions。
- 导航到 激活订阅 并输入您的 16 位激活号。
下载 ZIP 和 TAR 文件
要访问 ZIP 或 TAR 文件,请使用客户门户网站查找下载的相关文件。如果您使用 RPM 软件包,则不需要这一步。
- 打开浏览器并登录红帽客户门户网站 产品下载页面,网址为 access.redhat.com/downloads。
- 在 Integration and Automation 类别中找到 Red Hat Integration 条目。
- 选择所需的 Service Registry 产品。此时会打开 Software Downloads 页面。
- 单击组件的 Download 链接。
更新于 2023-09-19