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 引用的工件返回。
其他资源
对于 Java 示例应用程序,请参阅: