Spring Cloud Router Sink 3.0.2适配Kafka Avro(De)Serializer相关问题问询
问题1:router-sink 3.0.2适配自定义转换器的方案
- 方案一:自定义构建router-sink镜像/安装包,将项目用到的Avro序列化相关依赖(比如
kafka-avro-serializer、spring-cloud-stream-schema、对应Avro生成类的依赖包)加入项目依赖,同时在配置中显式声明序列化/反序列化实现类,示例配置如下:
spring: cloud: stream: kafka: bindings: input: consumer: key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: io.confluent.kafka.serializers.KafkaAvroDeserializer # 对应输出路由的binding也需配套配置序列化规则 output.*: producer: key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: io.confluent.kafka.serializers.KafkaAvroSerializer binder: brokers: ${application.brokers} # 依赖Schema Registry的场景需要补充该配置 configuration: schema.registry.url: ${your.schema.registry.url}
- 方案二:如果不想修改官方原生router-sink包,可以在启动router-sink实例时,通过
--loader.path参数指定外部依赖包的存放路径,将Avro相关的Jar包放在该路径下即可被类加载器识别。
问题2:仅用消息头时的payload透传配置
存在无需解析Avro payload的配置方案,直接让框架跳过Avro转换,将payload以原始字节形式透传即可,完全不影响header路由逻辑,配置如下:
spring: cloud: stream: default: # 替换原有avro contentType,避免触发Avro转换器 contentType: application/octet-stream bindings: input: group: ... consumer: use-native-decoding: true kafka: bindings: input: consumer: # 直接用字节反序列化,不触发Avro转换逻辑 value-deserializer: org.apache.kafka.common.serialization.ByteArrayDeserializer binder: brokers: ${application.brokers}
配置完成后payload会以byte[]类型存在,非空,不会触发Payload must not be null报错,原有路由表达式不需要做任何修改即可正常运行。
内容的提问来源于stack exchange,提问作者Gleb
相关产品推荐
相关产品推荐

