无法从外部应用程序连接到Kafka

时间:2020-02-18 11:21:25

标签: docker apache-kafka docker-swarm

我有两台docker机器,我想在docker swarm中创建一个kafka集群。我的docker-compose.yml看起来像这样:

version: '3.2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka:latest
    ports:
      - "9092:9092"
      - "29092:29092"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_LISTENERS: PLAINTEXT://:9092,PLAINTEXT_HOST://:29092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092

我遵循了这个问题:Unable to connect to Kafka run in container from Spring Boot app run outside container,我正尝试使用 localhost:29092 从外部访问kafka。

我已经在kafka中创建了主题mytesttopic。下面的python代码:

from kafka import KafkaConsumer, SimpleProducer, TopicPartition, KafkaClient


def consume_from_topic():
    try:
        consumer = KafkaConsumer('mytesttopic',
                                 group_id= None,
                                 bootstrap_servers=['localhost:29092'],
                                 auto_offset_reset='earliest')

        for message in consumer:
            #consumer.commit()
            print ("%s:%d:%d: key=%s value=%s" % (message.topic, message.partition,
                                                  message.offset, message.key,
                                                  message.value))
    except Exception as e:
        print(e)
        pass



if __name__ == '__main__':
    consume_from_topic()

返回:

没有经纪人

有人知道我在这里想念什么吗?

2 个答案:

答案 0 :(得分:0)

鉴于您正在另外2台计算机上运行docker swarm,由于kafka将在docker swarm节点上的端口poseX上暴露,您将无法在poses上进行连接。尝试使用一个节点的主机名+端口29092连接到kafka。您应该可以通过这种方式连接到kafka。

请注意,这仅在您使用routing mesh运行docker swarm时起作用,路由网格确保每个节点都在已发布的端口上接受任何服务的传入请求,无论它是否正在运行。相同的主机,并确保流量到达容器正在运行的实际主机。

如果您尚未设置路由网格,请尝试连接到运行kafka容器的实际主机名(不推荐,但出于测试目的,它可以工作)

希望对您有帮助!

答案 1 :(得分:0)

您的听众是完全一样的。

您需要设置PLAINTEXT_HOST://0.0.0.0:29092将侦听器绑定到所有接口