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

本地Spring应用连接Kafka集群时出现连接断开异常

问题诊断与解决

核心问题

你的Kafka容器配置中,外部监听器(LISTENER_EXTERNAL)绑定了容器内部的localhost,导致容器无法接收来自宿主机Spring应用的连接请求。虽然端口做了映射,但Kafka服务只监听容器自身的127.0.0.1接口,宿主机的请求无法被处理,因此连接会立即断开。

修复步骤

修改docker-compose.yml中两个Kafka节点的KAFKA_LISTENERS配置,将外部监听器的绑定地址改为0.0.0.0,确保容器监听所有可用网络接口:

修改后的kafka-1配置

kafka-1:
  image: confluentinc/cp-kafka:latest
  container_name: kafka-1
  ports:
    - '19092:19092'
    - '9092:9092'
  environment:
    KAFKA_BROKER_ID: 1
    KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_INTERNAL:PLAINTEXT,LISTENER_EXTERNAL:PLAINTEXT
    # 关键修改:将LISTENER_EXTERNAL绑定到0.0.0.0
    KAFKA_LISTENERS: LISTENER_INTERNAL://kafka-1:19092,LISTENER_EXTERNAL://0.0.0.0:9092
    KAFKA_ADVERTISED_LISTENERS: LISTENER_INTERNAL://kafka-1:19092,LISTENER_EXTERNAL://localhost:9092
    KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_INTERNAL
    KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
    KAFKA_LOG4J_LOGGERS: "kafka.server=DEBUG,kafka.network=TRACE"
  depends_on:
    - zookeeper
  networks:
    - microservices-net

修改后的kafka-2配置

kafka-2:
  image: confluentinc/cp-kafka:latest
  container_name: kafka-2
  ports:
    - '29092:29092'
    - '9093:9093'
  environment:
    KAFKA_BROKER_ID: 2
    KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_INTERNAL:PLAINTEXT,LISTENER_EXTERNAL:PLAINTEXT
    # 关键修改:将LISTENER_EXTERNAL绑定到0.0.0.0
    KAFKA_LISTENERS: LISTENER_INTERNAL://kafka-2:29092,LISTENER_EXTERNAL://0.0.0.0:9093
    KAFKA_ADVERTISED_LISTENERS: LISTENER_INTERNAL://kafka-2:29092,LISTENER_EXTERNAL://localhost:9093
    KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_INTERNAL
    KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
  depends_on:
    - zookeeper
  networks:
    - microservices-net

验证方法

  1. 重启Kafka集群:docker-compose down && docker-compose up -d
  2. 查看Kafka容器日志,确认监听器绑定地址为0.0.0.0:
    INFO Awaiting socket connections on 0.0.0.0:9092. (kafka.network.DataPlaneAcceptor)
    
  3. 重新启动Spring应用,检查日志是否出现成功连接的信息,比如:
    INFO [AdminClient clientId=authentication-service-admin-0] Successfully fetched API versions from node 1.
    

补充说明

  • KAFKA_LISTENERS用于配置Kafka服务实际监听的网络接口,0.0.0.0表示监听所有接口,确保容器外部的请求能被接收。
  • KAFKA_ADVERTISED_LISTENERS用于告诉客户端如何连接Kafka,这里保持localhost:9092/9093是因为Spring应用运行在宿主机,需要指向宿主机的端口映射地址。

内容的提问来源于stack exchange,提问作者user27248253

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:32:13