You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot生产者无法向Docker部署的Kafka发送消息问题求助

问题根因
  1. WSL2网络隔离:Windows环境下的WSL2默认采用NAT网络架构,WSL内部Docker映射的9092端口无法直接通过Windows侧的localhost正常访问
  2. Kafka广播地址配置错误:docker-compose中KAFKA_ADVERTISED_LISTENERS默认使用127.0.0.1作为对外暴露地址,Windows侧客户端拿到该地址后无法定位到WSL内部的Kafka服务,所以不断抛出连接断开警告
  3. 生产者配置错误:你的Spring Boot配置中,生产者的序列化类错误配置为反序列化类,也会引发后续数据发送异常
  4. (可选)未预先创建目标主题:如果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]:9092
    
    改完后重启容器:docker-compose down && docker-compose up -d
  • 修改Spring Boot配置:将所有bootstrap-servers中的localhost替换为WSL IP,同时修正生产者的序列化类配置
    生产者properties配置示例:
    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
    
    消费者yaml配置同步替换bootstrap-servers的localhost即可
  • (可选)手动创建目标主题:进入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:27:01