.NET客户端连接Docker部署的Kafka指定9094却报9092无法解析
问题原因
你的问题本质是Kafka监听器配置和端口映射不匹配,导致客户端拿到了Docker内部网络的Broker地址,无法解析。
首先明确Kafka客户端和Broker的交互逻辑:
- 客户端首先连接你配置的
bootstrap.servers地址(也就是你填的localhost:9094) - 连接成功后,Broker会把自己
advertised.listeners配置中对应监听器的地址返回给客户端,后续所有通信客户端都会使用这个返回的地址,而非初始填写的bootstrap地址。
你现有配置存在两个错误:
KAFKA_LISTENERS中OUTSIDE监听器绑定了容器本地回环地址localhost:9094,外部宿主机发来的请求无法被这个监听器接收,请求只能进入监听Docker内部网络的INTERNAL监听器(端口9092),Broker会把INTERNAL对应的通告地址kafka:9092返回给客户端,你的宿主机没有配置kafka域名到Docker容器IP的映射,自然无法解析。- 端口映射配置为
9094:9092,把宿主机9094端口映射到了容器内部的9092端口(即INTERNAL监听器的端口),完全没有用到你配置的9094外部监听器端口。
修复方案
修改docker-compose.yml中kafka服务的配置,调整后的完整kafka配置如下:
kafka: image: confluentinc/cp-kafka:latest container_name: kafka depends_on: - zookeeper ports: - 9094:9094 # 宿主机9094映射容器外部监听器的9094端口 environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 # 监听器绑定0.0.0.0,允许所有网卡的请求进入 KAFKA_LISTENERS: INTERNAL://0.0.0.0:9092,OUTSIDE://0.0.0.0:9094 # 通告地址保持不变,内部网络用kafka:9092,外部用localhost:9094 KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,OUTSIDE://localhost:9094 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,OUTSIDE:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" KAFKA_DELETE_TOPIC_ENABLE: "true" KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 extra_hosts: - "localhost: 127.0.0.1" networks: - app-network
修改后重启容器即可解决问题。
内容的提问来源于stack exchange,提问作者James Gatt
相关产品推荐
相关产品推荐

