【问题标题】:Error with docker-compose up when running a micro service with kafka and zookeeper使用 kafka 和 zookeeper 运行微服务时 docker-compose up 出错
【发布时间】:2018-10-19 13:49:32
【问题描述】:

已解决!谢谢你们,我要更新正确的配置才能工作。

我正在尝试通过 docker-compose 使用 spring-boot、kafka 和 zookeeper 来做我的第一个微服务。我正在追随https://docs.docker.com/compose/gettingstarted/的脚步 但是当我尝试使用 docker-compose up 命令提升服务时,我遇到了一个异常:

demo-quartz_1  | web - 2018-05-09 14:57:48,824 [scheduler_Worker-2] INFO  c.a.d.service.SampleJobService - created entity...
demo-quartz_1  | web - 2018-05-09 14:57:48,824 [scheduler_Worker-2] INFO  c.a.d.service.SampleJobService - BitcoinEuroEntity [idBCEntity=8, id=bitcoin, name=Bitcoin, symbol=BTC, rank=1, priceUsd=9299.31, priceBtc=1.0, _24hVolumeUsd=7170100000.0, marketCapUsd=158311453440, availableSupply=17024000.0, totalSupply=17024000.0, maxSupply=21000000.0, percentChange1h=0.05, percentChange24h=1.36, percentChange7d=1.7, lastUpdated=1525877672, priceEur=7830.80946135, _24hVolumeEur=6037833658.5, marketCapEur=133311700270]
demo-quartz_1  | web - 2018-05-09 14:58:38,868 [scheduler_Worker-1] ERROR o.s.k.s.LoggingProducerListener - Exception thrown when sending a message with key='null' and payload='BitcoinEuroKafkaEntity [id=bitcoin, name=Bitcoin, symbol=BTC, rank=1, priceUsd=9299.31, priceBtc=1.0...' to topic aironman:
demo-quartz_1  | org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.

我可以看到 zookeeper、kafka 和微服务容器在它们的容器中运行良好:

$:demo-quartz aironman$ docker ps
CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS              PORTS                                                NAMES
f9201046956c        wurstmeister/kafka                    "start-kafka.sh"         7 minutes ago       Up 6 minutes        0.0.0.0:9092->9092/tcp                               demo-quartz_kafka_1
386270f126da        aironman/demo-quartz:0.0.1-SNAPSHOT   "/usr/bin/java -jar …"   7 minutes ago       Up 6 minutes                                                             demo-quartz_demo-quartz_1
ac1df2c6429d        wurstmeister/zookeeper                "/bin/sh -c '/usr/sb…"   7 minutes ago       Up 6 minutes        22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   demo-quartz_zookeeper_1

这是GitHub repodevelop 分支

Docker 文件如下所示:

FROM openjdk:8-jre
ENTRYPOINT ["/usr/bin/java", "-jar", "/usr/share/aironman/demo-quartz.jar"]
ARG JAR_FILE
ADD target/${JAR_FILE} /usr/share/aironman/demo-quartz.jar

Docker-compose.yml 文件看起来像:

version: '3.6'
services:
demo-quartz:
image: aironman/demo-quartz:0.0.1-SNAPSHOT
deploy:
  replicas: 5
  resources:
    limits:
      cpus: "0.5"
      memory: 512M
  restart_policy:
      condition: on-failure

  zookeeper:
  image: wurstmeister/zookeeper
  ports:
  - "2181:2181"

  kafka:
  image: wurstmeister/kafka
  ports:
  - "9092:9092"
  environment:
  KAFKA_BROKER_ID: 1
  KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
  KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
  KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
  volumes:
  - /var/run/docker.sock:/var/run/docker.sock

这是 docker-compose up 命令完整输出的link

微服务的application.properties文件如下:

using.spring.schedulerFactory=true
kafka.bootstrapAddress=kafka:9092
message.topic.name=aironman
greeting.topic.name=greeting
filtered.topic.name=filtered
partitioned.topic.name=partitioned

我一直在查看 stackoverflow 中存在类似问题的其他线程,但它们都没有帮助我通过提升微服务以及 zookeeper 和 kafka 相互交谈来解决问题。

看起来微服务无法与kafka通信而zookeeper不能,因为docker-compose运行容器但微服务容器无法相互通信。如果我使用 mvn spring-boot:run 在本地运行该进程并在本地运行 zookeeper 和 kafka,它工作正常,我可以将消息推送到主题中。

您能指导我找到正确的解决方案吗?

谢谢大家,我学到了很多!

:demo-quartz aironman$ docker exec -it 693ab89a26fb  /bin/sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:13:00:03  
      inet addr:172.19.0.3  Bcast:172.19.255.255  Mask:255.255.0.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:227 errors:0 dropped:0 overruns:0 frame:0
      TX packets:390 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:20677 (20.1 KiB)  TX bytes:30809 (30.0 KiB)

lo        Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      UP LOOPBACK RUNNING  MTU:65536  Metric:1
      RX packets:6 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1 
      RX bytes:590 (590.0 B)  TX bytes:590 (590.0 B)

/ # ping 172.19.0.2
PING 172.19.0.2 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.190 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.167 ms
64 bytes from 172.19.0.2: seq=2 ttl=64 time=0.121 ms
64 bytes from 172.19.0.2: seq=3 ttl=64 time=0.173 ms
64 bytes from 172.19.0.2: seq=4 ttl=64 time=0.173 ms
^C
--- 172.19.0.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.121/0.164/0.190 ms
/ # 
/ # 
/ # 
/ # kafka-topics.sh --list --zookeeper 172.19.0.2:2181
/ # kafka-topics.sh --create --zookeeper 172.19.0.2:2181 --replication-factor 1 
--partitions 1 --topic aironman 
Created topic "aironman".
/ # kafka-topics.sh --list --zookeeper 172.19.0.2:2181
aironman

可以看到主题是在kafka broker中创建的,但是还是会出现异常。

【问题讨论】:

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


    【解决方案1】:

    我让它为 Kafka 使用这个配置。

    kafka:
    image: wurstmeister/kafka
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
    

    关键配置是让 docker 服务名称和公布的主机名相同(在本例中为 kafka)。在您的 application.properties 中,您可以使用 kafka.bootstrapAddress=kafka:9092。

    由于所有的 docker 服务都写在同一个 docker-compose.yml 中,它们都将参与同一个默认网络,并且能够通过服务名称相互解析。

    更新:使用原始问题中的 docker-compose,更新很少。

     version: '3.3'
        services:
          demo-quartz:
            image: aironman/demo-quartz:0.0.1-SNAPSHOT
    
          zookeeper:
            image: wurstmeister/zookeeper
            ports:
              - "2181:2181"
          kafka:
            image: wurstmeister/kafka
            ports:
              - "9092:9092"
            environment:
              KAFKA_BROKER_ID: 1
              KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
              KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
              KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
    

    这工作得很好。您是否已将引导 url 更新为 bootstrap.servers = kafka:9092?此外,demo-quartz 使用的是旧版本的 Kafka 客户端。请更新。

    web - 2018-05-09 18:17:29,260 [scheduler_Worker-1] INFO  o.a.kafka.common.utils.AppInfoParser - Kafka version : 0.10.1.1
    web - 2018-05-09 18:17:29,260 [scheduler_Worker-1] INFO  o.a.kafka.common.utils.AppInfoParser - Kafka commitId : f10ef2720b03b247
    

    您可以从此处构建示例 kafka 生产者 docker 映像:https://github.com/vallikranth/kafka-spring-producer 并验证您的设置。

    【讨论】:

    • 在您的撰写文件中,由于depends_on,它们可以通过服务名称相互解析。这是按服务名称解析所必需的。
    • 我根据您的建议更新了 docker-compose.yml 文件,但仍然无法正常工作。您是否使用了我在 GitHub 上的项目代码来使其工作? @Vallikranth
    • 感谢@Vanlightly。我删除了depends_on,它仍然可以正常工作。它之所以有效,是因为单个 docker-compose.yml 中的所有服务都是同一网络的一部分。参考:docs.docker.com/compose/networking
    • @aironman:我从部署在本地 docker 中的 kafka 设置中提供了 docker-compose 的代码 sn-p。我写了一个简单的 spring boot Kafka producer 来测试连通性。让我试试你更新的 docker-compose.yml 并回复你。
    • @Vallikranth,是的,你是对的。我想我有一些学习要做!
    【解决方案2】:

    我绝不是 Docker 专家,但我相信创建的默认网络类型是桥接网络。使用桥接网络,您需要明确链接服务,以便它们可以看到彼此。

    例如: version: '3.6' services: demo-quartz: image: aironman/demo-quartz:0.0.1-SNAPSHOT deploy: replicas: 5 resources: limits: cpus: "0.5" memory: 512M restart_policy: condition: on-failure links: - kafka - zookeeper zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" kafka: image: wurstmeister/kafka ports: - "9092:9092" links: - zookeeper environment: KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - /var/run/docker.sock:/var/run/docker.sock

    【讨论】:

    • 感谢@Vanlightly,但仍然无法正常工作,同样的结果,我将使用新数据更新线程。我可以连接 zookeepers 和 kafka 容器,我可以运行 ifconfig,查看他们分配的 ip,可以互相 ping,但我无法使用命令 kafka-topics.sh --create --zookeeper zookeeper_ip 创建 kafka 主题:第2181章 --replication-factor 1 --partitions 1 --topic aironman
    猜你喜欢
    • 2021-06-13
    • 2023-03-09
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多