Spring Boot生产者连接KRaft模式Bitnami Kafka报错求助
解决Spring Boot生产者连接KRaft模式Kafka报UnsupportedVersionException的方案
核心原因分析
这个错误本质是Kafka客户端与broker的API协议版本不匹配,或是broker配置限制了可使用的协议版本。虽然Kafka 3.6原生支持METADATA和INIT_PRODUCER_ID这些基础API,但以下配置问题会触发该错误:
具体解决方案
1. 修正Kafka Broker的协议版本与监听配置
在你的docker-compose.yml中,确保Bitnami Kafka的环境变量符合KRaft模式要求,同时指定匹配版本的协议:
services: kafka: image: bitnami/kafka:3.6 ports: - "9093:9093" environment: - KAFKA_CFG_NODE_ID=0 - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9092 - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://0.0.0.0:9093,CONTROLLER://:9094 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:9093 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT,CONTROLLER:PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT - KAFKA_INTER_BROKER_PROTOCOL_VERSION=3.6 # 与broker版本保持一致 - ALLOW_PLAINTEXT_LISTENER=yes - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true # 自动创建主题(可选)
2. 调整Spring Boot Kafka客户端配置
在application.yml中,指定正确的bootstrap地址,并开启API版本自动协商,也可显式指定匹配broker的版本:
spring: kafka: bootstrap-servers: localhost:9093 # 对应docker中PLAINTEXT_HOST的监听地址 producer: key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: org.apache.kafka.common.serialization.StringSerializer properties: api.version.request: true # 开启API版本协商 metadata.max.age.ms: 30000 # 可选:强制客户端使用与broker匹配的版本 broker.version.fallback: 3.6 api.version.fallback.ms: 0
3. 统一Kafka客户端版本
Spring Boot 3.2.1默认依赖的Kafka客户端版本是3.5.1,你可以手动升级到与broker一致的3.6.0版本,消除版本差异:
- Maven依赖:
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.6.0</version> </dependency>
- Gradle依赖:
implementation 'org.apache.kafka:kafka-clients:3.6.0'
4. 清理旧环境并重启
删除Kafka容器及数据卷(避免旧配置残留),再重新启动服务:
# 停止并清理容器和数据卷 docker-compose down -v # 重新启动Kafka docker-compose up -d # 重启Spring Boot应用
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

