Spring Boot生产者无法向Docker部署的Kafka发送消息问题求助
问题根因
- WSL2网络隔离:Windows环境下的WSL2默认采用NAT网络架构,WSL内部Docker映射的9092端口无法直接通过Windows侧的localhost正常访问
- Kafka广播地址配置错误:docker-compose中
KAFKA_ADVERTISED_LISTENERS默认使用127.0.0.1作为对外暴露地址,Windows侧客户端拿到该地址后无法定位到WSL内部的Kafka服务,所以不断抛出连接断开警告 - 生产者配置错误:你的Spring Boot配置中,生产者的序列化类错误配置为反序列化类,也会引发后续数据发送异常
- (可选)未预先创建目标主题:如果Kafka关闭了自动创建主题开关,未手动创建
t_hello主题也会触发元数据获取超时
解决方案
- 首先获取WSL2的实际IP:在WSL的Ubuntu终端执行命令
ip addr show eth0,找到inet字段对应的IP地址(格式一般为172.x.x.x) - 修改docker-compose.yml配置:将KAFKA_ADVERTISED_LISTENERS中的外部监听地址替换为上一步获取的WSL IP
改完后重启容器:KAFKA_ADVERTISED_LISTENERS: DOCKER_INTERNAL://kafka:29092,DOCKER_EXTERNAL://[你的WSL IP]:9092docker-compose down && docker-compose up -d - 修改Spring Boot配置:将所有
bootstrap-servers中的localhost替换为WSL IP,同时修正生产者的序列化类配置
生产者properties配置示例:
消费者yaml配置同步替换bootstrap-servers的localhost即可spring.kafka.producer.bootstrap-servers=[你的WSL IP]:9092 spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer - (可选)手动创建目标主题:进入Kafka容器执行以下命令预先创建
t_hello主题docker exec -it kafka kafka-topics.sh --create --topic t_hello --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1 - 长期适配方案:如果不想每次WSL重启都修改IP,可以在Windows侧配置WSL端口转发,或者修改Windows hosts文件绑定WSL IP与自定义域名,简化后续配置修改操作
内容的提问来源于stack exchange,提问作者Jeff Cook
相关产品推荐
相关产品推荐

