Docker compose为kafka服务配置侦听器时出错。没有经纪人

Docker compose为kafka服务配置侦听器时出错。没有经纪人,docker,apache-kafka,docker-compose,Docker,Apache Kafka,Docker Compose,我试着用Kafka@Wurstmeister设置一个docker compose 场景: 我开发了多个微服务的体系结构。具体来说:我有一个spring boot应用程序,它将JSON发送给我的kafka代理。烧瓶服务使用数据。 当运行整个think outside docker时,这一点起作用。我还能够将数据发送到docker中的卡夫卡主题 代码: 烧瓶: Docker Compose: zookeeper: image: wurstmeister/zookeeper ports

我试着用Kafka@Wurstmeister设置一个docker compose

场景: 我开发了多个微服务的体系结构。具体来说:我有一个spring boot应用程序,它将JSON发送给我的kafka代理。烧瓶服务使用数据。 当运行整个think outside docker时,这一点起作用。我还能够将数据发送到docker中的卡夫卡主题

代码: 烧瓶:

Docker Compose:

zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
    networks:
      - test-net

  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      #KAFKA_ADVERTISED_HOST_NAME: 172.17.0.1
      KAFKA_LISTENERS: PLAINTEXT://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://172.17.0.1:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CREATE_TOPICS: "TEST:1:1"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - zookeeper
    networks:
      - test-net
错误

Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from controller import Controller
  File "/app/controller/Controller.py", line 27, in <module>
    consumer = KafkaConfig.initkafka()
  File "/app/config/KafkaConfig.py", line 16, in initkafka
    enable_auto_commit=False)
  File "/usr/local/lib/python3.6/site-packages/kafka/consumer/group.py", line 324, in __init__
    self._client = KafkaClient(metrics=self._metrics, **self.config)
  File "/usr/local/lib/python3.6/site-packages/kafka/client_async.py", line 221, in __init__
    self.config['api_version'] = self.check_version(timeout=check_timeout)
  File "/usr/local/lib/python3.6/site-packages/kafka/client_async.py", line 826, in check_version
    raise Errors.NoBrokersAvailable()
kafka.errors.NoBrokersAvailable: NoBrokersAvailable
回溯(最近一次呼叫最后一次):
文件“run.py”,第1行,在
从控制器导入控制器
文件“/app/controller/controller.py”,第27行,在
consumer=kafkanconfig.initkafka()
initkafka中的文件“/app/config/kafkanconfig.py”,第16行
启用(自动提交=错误)
文件“/usr/local/lib/python3.6/site packages/kafka/consumer/group.py”,第324行,在__
self.\u client=KafkaClient(metrics=self.\u metrics,**self.config)
文件“/usr/local/lib/python3.6/site packages/kafka/client_async.py”,第221行,在u_init中__
self.config['api\u version']=self.check\u version(超时=检查超时)
文件“/usr/local/lib/python3.6/site packages/kafka/client_async.py”,第826行,检查版本
引发错误。NoBrokersAvailable()
kafka.errors.NoBrokersAvailable:NoBrokersAvailable
我认为这是一个环境配置的问题。我已经阅读了wurstmeister文档,但是我不知道需要设置什么才能让我的flask服务找到kafka代理。 日志显示卡夫卡正在运行,主题“测试”已经创建。 我是否必须配置侦听器,例如,使用网络中的ip和端口来侦听kafka?因为在广告中,listeners被描述为

要发布到ZooKeeper以供客户端使用的侦听器(如果与侦听器配置属性不同)。在IaaS环境中,这可能需要与代理绑定到的接口不同。如果未设置,则将使用侦听器的值。与侦听器不同,播发0.0.0.0元地址无效


除非我弄错了,
KAFKA\u侦听器
需要与您在flask客户端中定义的KAFKA主机具有相同的值。因此,如果您是从docker容器内部连接到Kafka,则应该有
Kafka\u播发的侦听器:PLAINTEXT://Kafka:9092
。如果从主机连接,它应该是
KAFKA\u advised\u监听器:PLAINTEXT://localhost:9092

或者,您可以省略
KAFKA_advised_LISTENERS
设置,而是定义
KAFKA_advised_HOST_NAME:KAFKA

,所以我已经看过@cricket_007提到的内容。现在有点清楚了,但我仍在努力争取联系。 作为对我的场景的总结:我在同一个Docker网络中运行我的所有服务和MessageBroker。因此,不需要进行外部连接。 在此博客条目中,给出了一个示例:

KAFKA_LISTENERS: LISTENER_BOB://kafka0:29092,LISTENER_FRED://localhost:9092
KAFKA_ADVERTISED_LISTENERS: LISTENER_BOB://kafka0:29092,LISTENER_FRED://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_BOB:PLAINTEXT,LISTENER_FRED:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_BOB
我想我知道这个配置意味着什么。 就我而言,我认为我必须这样改变:

      KAFKA_LISTENERS: LISTENER_PY://kafka:9092
      KAFKA_ADVERTISED_LISTENERS: LISTENER_PY://kafka:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_PY:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_PY

我想不需要卡夫卡的名字,因为我只有一个经纪人。但是侦听器名称(listener_PY)是否依赖于我的Flask服务名称或任何其他属性?据我所知,我可以使用“kafka”作为ip,因为我在docker compose中将kafka作为名为“kafka”的服务运行。我尝试过这种配置,但仍然不起作用。我想知道,在我的spring服务中,作为生产者连接而不定义任何侦听器配置是如何工作的

您是否将flask应用程序作为容器或直接部署在本地主机上?两者都有。我只使用flask服务尝试编写文件,它是mongodb实例。我禁用了卡夫卡连接,它可以正常工作。但是当我启用卡夫卡连接时,我得到了错误。当使用kafka运行整个项目(所有涉及的服务)时,它也可以正常工作。所以为了在我的容器中运行它,我只是将“localhost”更改为flask容器中compose文件中的服务名称,如果您可以通过
ping kafka
获得肯定的结果,那么请尝试
telnet kafka 9092
如果您的连接被拒绝,那么请确保kafka绑定在
0.0.0.0
上,以便其他容器可以访问它,并将以下环境变量设置为
kafka\u播发的侦听器:明文://0.0.0:9092
请阅读内容对您来说,确切地说是指来自容器内部和主机的连接。我以为这是发布订阅。因此,我的Kafka容器在docker网络中提供了一个主机:端口,用于订阅阅读主题。此主机应该是我的docker服务的反DNS条目(服务名称)?当我使用'KAFKA\u advised_LISTENERS:PLAINTEXT://KAFKA:9092,PLAINTEXT://localhost:9092'时,我得到
java.lang.IllegalArgumentException:requirement失败:每个侦听器必须有不同的端口,侦听器:PLAINTEXT://KAFKA:9092,PLAINTEXT://localhost:9092
好,我将编辑我的答案,然后。我的观点是,播发的侦听器必须与使用者使用的主机名相对应。因此,是的,当flask在docker内部运行时,播发的侦听器等于docker服务的DNS条目,也称为“kafka”。好的,由于错误NoBrokersAvailable和日志,我确信主题已创建。我是否可以检查其他配置?对不起,我不理解您的问题:-/建议的设置是否适合您?对不起,我的评论有点混乱。我只是想说,在查看了日志之后,我确信这一定是侦听器配置的问题。
      KAFKA_LISTENERS: LISTENER_PY://kafka:9092
      KAFKA_ADVERTISED_LISTENERS: LISTENER_PY://kafka:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_PY:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_PY