在AWS EC2上部署SpringBoot+Kafka时Broker连接失败求助
Kafka Broker连接失败问题排查与解决
错误信息
Connection to node -1 (/3.45.74.77:9093) could not be established. Broker may not be available.imageone_container | 2024-03-19T09:15:19.776Z WARN 1 --- [ntainer#1-0-C-1] org.apache.kafka.clients.NetworkClient : [Consumer clientId=consumer-stringgroup-2, groupId=stringgroup] Bootstrap broker 3.45.74.77:9093 (id: -1 rack: null) disconnected
问题原因
- Spring Boot应用容器与Kafka容器处于同一Docker内部网络,却配置了EC2公网IP+Kafka内部监听端口(9093)连接。9093是Kafka仅对Docker内部开放的端口,未映射到EC2宿主机,公网IP无法访问该端口。
- Docker Compose默认创建共享网络,容器间应通过服务名(如
kafka)而非公网IP通信。
解决方案
1. 修改Spring Boot应用的Kafka连接配置
在Docker Compose文件的spring-boot-app服务中,将SPRING_KAFKA_BOOTSTRAP_SERVERS环境变量改为kafka:9093:
spring-boot-app: build: context: . dockerfile: Dockerfile image: imageone container_name: imageone_container ports: - "9000:9000" depends_on: - kafka environment: SPRING_KAFKA_BOOTSTRAP_SERVERS: kafka:9093 # 改为Docker服务名+内部端口 SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/samdb SPRING_DATASOURCE_USERNAME: sam SPRING_DATASOURCE_PASSWORD: 1234
2. 验证Kafka监听配置(无需修改)
当前Kafka的监听配置是正确的,内部容器通过INSIDE://kafka:9093通信,外部客户端通过OUTSIDE://3.45.74.77:9092访问:
kafka: image: wurstmeister/kafka container_name: kafka ports: - "9092:9092" environment: KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://3.45.74.77:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092 KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
3. 重启服务
执行以下命令重启所有容器:
docker-compose down docker-compose up --build
额外注意事项
depends_on仅保证容器启动顺序,不保证Kafka服务完全就绪。如需确保Kafka就绪后启动Spring Boot,可添加健康检查或使用等待脚本(如wait-for-it.sh)。- 若有外部客户端需访问Kafka,需确保EC2安全组开放9092端口;内部容器通信无需开放该端口。
内容的提问来源于stack exchange,提问作者ASIF KAIF
相关产品推荐
相关产品推荐

