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

Wurstmeister Kafka Docker Compose配置问题:Flask无法连接Broker

解决Docker Compose中Flask服务无法连接Wurstmeister Kafka的问题

你遇到的核心问题是Kafka的网络配置与Flask容器的访问逻辑不匹配,同时Flask代码里创建KafkaConsumer的方式也存在错误,以下是分步解决方案:

1. 修正Kafka的Docker Compose配置

你的KAFKA_ADVERTISED_LISTENERS设置成了宿主机的网桥地址172.17.0.1:9092,但在Docker Compose的内部网络(test-net)中,Flask容器应该通过服务名kafka来访问Kafka Broker,而不是宿主机地址。

修改后的Kafka配置如下:

kafka:
  image: wurstmeister/kafka
  ports:
    - "9092:9092"  # 供本地Spring Boot应用外部访问
    - "9093:9093"  # 供Docker内部服务访问
  environment:
    KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_INTERNAL://0.0.0.0:9093
    KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://kafka:9093
    KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    KAFKA_CREATE_TOPICS: "TEST:1:1"
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  depends_on:
    - zookeeper
  networks:
    - test-net

配置说明:

  • KAFKA_LISTENERS:让Kafka监听所有网卡的两个端口,分别对应外部(本地Spring Boot)和内部(Flask容器)访问场景
  • KAFKA_ADVERTISED_LISTENERS:向ZooKeeper注册两个可访问地址:
    • PLAINTEXT://localhost:9092:供宿主机上的Spring Boot应用连接
    • PLAINTEXT_INTERNAL://kafka:9093:供Docker内部网络的Flask服务连接
  • 如果不需要区分内外网,也可以简化配置:
    KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
    KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT://localhost:9092
    

2. 修正Flask的KafkaConsumer代码

你的代码存在两个关键问题:

  • 多次创建KafkaConsumer实例,但只有第一个被赋值给consumer,后续的配置参数(如auto_offset_reset、反序列化器)完全没有生效
  • 反序列化器中存在拼写错误:m.dedoce('utf-8')应该是m.decode('utf-8')

修正后的代码:

KafkaHost = "kafka:9093"  # 对应Docker内部访问端口;如果用简化配置则改为9092

def initkafka():
    # 将所有配置合并到一个KafkaConsumer实例中
    consumer = KafkaConsumer(
        "TEST",
        group_id='view',
        bootstrap_servers=[KafkaHost],
        auto_offset_reset='latest',
        enable_auto_commit=False,
        value_deserializer=lambda m: json.loads(m.decode('utf-8')),
        consumer_timeout_ms=1000
    )
    return consumer

3. 验证与重启

  1. 停止并清理现有容器:docker-compose down
  2. 重新启动服务:docker-compose up -d
  3. 查看Kafka日志确认配置生效:docker-compose logs kafka,你应该能看到类似Registered broker 0 at path /brokers/ids/0 with addresses: PLAINTEXT://kafka:9093,PLAINTEXT://localhost:9092的日志
  4. 启动Flask服务,检查是否还会抛出NoBrokersAvailable异常

调整后,Flask容器就能通过Docker内部网络的服务名kafka正确连接到Kafka Broker,同时本地的Spring Boot应用也能通过localhost:9092正常发送消息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:08:39