【问题标题】:Spring Boot containers can not connect to the Kafka containerSpring Boot 容器无法连接到 Kafka 容器
【发布时间】:2018-06-23 01:05:38
【问题描述】:

我正在尝试将微服务 Spring BootKafka 一起使用,但我的 Spring Boot 容器无法连接到 Kafka 容器。

docker-compose.yml:

version: '3'

services:

  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    restart: always
    ports:
      - 2181:2181

  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    restart: always
    ports:
      - 9092:9092
    depends_on:
      - zookeeper
    links:
      - zookeeper:zookeeper
    environment:
      KAFKA_ADVERTISED_HOST_NAME: localhost
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

  consumer:
    image: consumer
    container_name: consumer
    depends_on:
      - kafka
    restart: always
    ports:
      - 8084:8080
    depends_on:
      - kafka
    links:
      - kafka:kafka

  producer:
    image: producer
    container_name: producer
    depends_on:
      - kafka
    restart: always
    ports:
      - 8085:8080
    depends_on:
      - kafka
    links:
      - kafka:kafka

application.properties 在消费者中:

spring.kafka.consumer.bootstrap-servers=kafka:9092
spring.kafka.consumer.group-id=WorkUnitApp
spring.kafka.consumer.topic=kafka_topic

application.properties 在生产者中:

spring.kafka.producer.bootstrap-servers=kafka:9092

但如果我在容器中运行 Kafka 并在本地运行 Spring Boot 微服务,它就可以工作。

application.properties 在消费者中:

spring.kafka.consumer.bootstrap-servers=0.0.0.0:9092
spring.kafka.consumer.group-id=WorkUnitApp
spring.kafka.consumer.topic=kafka_topic

application.properties 在生产者中:

spring.kafka.producer.bootstrap-servers=0.0.0.0:9092

什么问题,为什么docker 中的links 不起作用?

附言0.0.0.0 因为mac os

已编辑

我在docker-compose.yml 环境中添加到kafka,但它仍然不起作用

  - KAFKA_ADVERTISED_PORT=9092

【问题讨论】:

  • 我们处于同样的情况,我不确定它是如何工作的,但是我们能够以一种可以从外部和内部使用文档示例中描述的多协议设置(INSIDE/OUTSIDE 部分):github.com/wurstmeister/kafka-docker#example
  • 你使用的是 mac 还是 Linux?
  • 您是否尝试将KAFKA_ADVERTISED_HOST_NAME 设置为kafka
  • @Thilo 我看了但没有成功(INSIDE/OUTSIDE 部分)
  • 我的意思正好相反——你试过KAFKA_ADVERTISED_HOST_NAME=kafka 吗?

标签: docker spring-boot apache-kafka docker-compose


【解决方案1】:

您需要将您的 Kafka 代理宣传为 kafka,这是所有链接容器的有效主机名(即客户端需要从 Kafka 连接到的主机名strong> 协议观点,所以kafka:9092 是正确的,而不是0.0.0.0):

kafka:
  ...
  environment:
    KAFKA_ADVERTISED_HOST_NAME: kafka

【讨论】:

  • kafka 配置中的“advertised host name”和“bootstrap servers”有什么区别?我无法从文档中弄清楚
  • @voipp "advertised host name" 告诉节点它应该如何向世界展示自己(即其他集群成员应该如何连接到它)。 “引导服务器”定义了一个 Kafka 节点列表,应该用于初始设置(即获取集群成员的实际列表)。
  • 感谢您的帮助。从kafka客户端(即kafkaTool)的角度来看,它会连接到什么主机?来自广告主机或引导服务器的主机?(如果它们不同)。可能你有解释这些主题的好文章吗?
  • @voipp 客户端将连接到引导服务器以获取要连接的活动节点列表。该列表中的条目将是每个服务器的广告主机名(+ 广告端口)。如果您有具体的设置问题,您可能应该提出一个新问题,因为这有点超出初始问题的范围(即为什么客户端无法连接到 Docker 中的 Kafka 服务器)。另外,请记住,给定的属性通常限定为特定的place
  • 澄清一下,bootstrap.servers 是客户端属性,而不是代理/服务器属性。我的第一条评论在这里可能有点误导。服务器使用 ZooKeeper 进行内部同步。
猜你喜欢
  • 2019-11-25
  • 2022-11-06
  • 1970-01-01
  • 2020-12-23
  • 2021-04-04
  • 2020-02-09
  • 2017-11-10
  • 2022-11-01
  • 2021-12-23
相关资源
最近更新 更多