【问题标题】:How to change target of the Spring Cloud Stream Kafka binder?如何更改 Spring Cloud Stream Kafka binder 的目标?
【发布时间】:2020-03-05 00:41:36
【问题描述】:

将 Spring Cloud Stream 2.1.4 与 Spring Boot 2.1.10 结合使用,我正在尝试定位 Kafka 的本地实例。 这是迄今为止我的 projetc 配置的摘录:

spring.kafka.bootstrap-servers=PLAINTEXT://localhost:9092
spring.kafka.streams.bootstrap-servers=PLAINTEXT://localhost:9092
spring.cloud.stream.kafka.binder.brokers=PLAINTEXT://localhost:9092
spring.cloud.stream.kafka.binder.zkNodes=localhost:2181
spring.cloud.stream.kafka.streams.binder.brokers=PLAINTEXT://localhost:9092
spring.cloud.stream.kafka.streams.binder.zkNodes=localhost:2181

但活页夹不断调用错误的目标:

java.io.IOException: Can't resolve address: kafka.example.com:9092

如果这些属性无法欺骗,我该如何指定目标? 此外,我通过 Docker Bitnami 映像部署 Kafka 实例,并且我不希望使用 SSL 配置(请参阅 PLAINTEXT 协议),但我找不到基本凭据登录的属性。有谁知道这是否绝望?

这是我的 docker-compose.yml

version: '3'
services: 
  zookeeper:
    image: bitnami/zookeeper:latest
    container_name: zookeeper
    environment:
      - ZOO_ENABLE_AUTH=yes
      - ZOO_SERVER_USERS=kafka
      - ZOO_SERVER_PASSWORDS=kafka_password
    networks:
      - kafka-net
  kafka:
    image: bitnami/kafka:latest
    container_name: kafka
    hostname: kafka.example.com
    depends_on:
      - zookeeper
    ports:
      - 9092:9092
    environment:
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_ZOOKEEPER_USER=kafka
      - KAFKA_ZOOKEEPER_PASSWORD=kafka_password
    networks:
      - kafka-net
networks:
  kafka-net:
    driver: bridge

提前致谢

【问题讨论】:

  • 我用过 Bitnami 图像就好了...你应该先测试 kafka-console-producer,但请显示你的 docker run 命令
  • 您好,我正在使用 docker-compose 模块(添加到问题中);只是运行 docker-compose up -d
  • 我没有答案,但仅供参考,您不再需要 zkNodes 属性。 SCSt 不与 zookeeper 对话。
  • 你是对的,只是尝试收集周围的东西:-(

标签: docker apache-kafka spring-cloud spring-kafka spring-cloud-stream


【解决方案1】:

hostname 不是问题,而是广告侦听器 protocol//:port 默认情况下导致主机名被广告的映射。您应该更改它,而不是主机名。

  kafka:
    image: bitnami/kafka:latest
    container_name: kafka
    hostname: kafka.example.com # <--- Here's what you are getting in the request
    ...
    environment:
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092 # <--- This returns the hostname to the clients

如果您计划在另一个容器外部运行您的代码,您应该在容器主机名之外或代替容器主机名上宣传localhost

One year later, my comment still is not been merged into the bitnami README,我可以在其中使用以下变量(已更改以匹配您的部署)

KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_CFG_LISTENERS=PLAINTEXT://:29092,PLAINTEXT_HOST://:9092
KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka.example.com:29092,PLAINTEXT_HOST://localhost:9092

【讨论】:

  • 感谢您的解释。我想知道:既然更改主机名解决了这个问题,你不认为其他变量是从那个单一值自动完成的吗?
  • 仅供参考,我不打算将我的应用程序运行到容器中,我认为 Kafka 最好单独部署。这仅用于概念证明目的。但我知道如果我想在另一台机器上运行该容器,我必须获得一个域名并进行设置,对吧?
  • 将应用程序部署为容器没有任何问题。我只是提到它是因为 docker 维护自己的网络桥接器。如果没有任何东西是容器化的,那么您就不需要处理端口映射和多个接口。关于域,大多数现代路由器都有相应的设置
【解决方案2】:

好的:通过两次查看“dockerfile”(感谢 cricket_007)来完成这项工作:

kafka:
...
    hostname: localhost

记录一下:我可以去掉上面的所有属性,默认是 Kafka localhost:9092

【讨论】:

  • hostname 不是你想要的。你应该使用KAFKA_ADVERTISED_LISTENERS env-var
  • 作为记录,我没有成功尝试更改配置如下:kafka:...主机名:kafka...环境:- ALLOW_PLAINTEXT_LISTENER=yes - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092 - KAFKA_CFG_ADVERTISED_LISTENERS =PLAINTEXT://kafka:9092
  • 除非你的代码运行在同一个 Docker 网络上的容器中,DNS 查找将在该容器中运行,否则你需要通告 localhost,而不是 Docker 服务名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
相关资源
最近更新 更多