8.3.3. 使用 Service Registry 配置 Protobuf SerDes

本主题解释了如何在 Google Protobuf 使用 Kafka 客户端序列化r 和 deserializer (SerDes)类。

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 deserializer

您必须将 Protobuf deserializer 类配置为与 serializer 中的以下配置设置匹配:

  • Service Registry URL
  • ID 编码

配置属性名称和值与 serializer 相同。

注意

配置 deserializer 时不需要以下选项:

  • 工件解析器策略
  • ID 位置

deserializer 类可以从消息中决定这些选项的值。策略并不是必需的,因为序列化器负责发送 ID 作为消息的一部分。

ID 位置是通过检查消息有效负载开始时的 magic 字节来确定的。如果找到该字节,则使用配置的处理程序从消息有效负载中读取 ID。如果没有找到音量字节,则 ID 会从邮件标头读取。

注意

Protobuf deserializer 不会反序列化到您确切的 Protobuf Message 实现,而是改为 DynamicMessage 实例。否则,没有适当的 API 来做。

protobuf SerDes 和 artifact 引用

当使用 导入 语句的复杂 Protobuf 消息时,导入的 Protobuf 消息会作为单独的工件存储在 Service Registry 中。然后,当 Service Registry 获取主 schema 来检查 Protobuf 消息时,还会检索引用的方案,以便可以检查和序列化的完整消息模式。

例如,下表_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 工件存储在 Service Registry 中,一个用于 TableInfo,另一个用于 模式。但是,由于 Mode表Info 的一部分,因此当获取 表Info 来检查 SerDes 中的消息时,模式 也会作为 表Info 引用的工件返回。

其他资源