第 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。