簡體   English   中英

我想用 docker 與我的客戶和卡夫卡經紀人溝通

[英]I want to communicate my client and kafka broker with docker compose

在同一個網絡中有客戶端、kafka 和 zookeeper,我正在嘗試使用 SERVICE_NAME:PORT 從客戶端連接到 kafka,但是

driver-service-container | 2022-07-24 09:00:05.076 WARN 1 --- [| adminclient-1] org.apache.kafka.clients.NetworkClient : [AdminClient clientId=adminclient-1] Connection to node 1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.

我得到一個錯誤。

我知道我可以使用服務名稱輕松地在同一網絡中通信容器,但我不明白為什么它不起作用。

我的客戶嘗試與 kafka 通信的名稱是driver-service

我查看了這些資源,但根據它們,我的方法應該有效:

連接到運行在 Docker 中的 Kafka

我的 Python/Java/Spring/Go/Whatever 客戶端無法連接到 Docker/AWS/我兄弟筆記本電腦中的 Apache Kafka 集群。 請幫忙

驅動程序服務 GitHub 存儲庫

我的 docker-compose 文件:

version: '3'
services:

  gateway-server:
    image: gateway-server-image
    container_name: gateway-server-container
    ports:
      - '5555:5555'
    environment:
      - SECURE_KEY_USERNAME=randomSecureKeyUsername!
      - SECURE_KEY_PASSWORD=randomSecureKeyPassword!
      - PASSENGER_SERVICE_URL=172.24.2.4:4444
      - DRIVER_SERVICE_URL=172.24.2.5:3333
    networks:
      microservicesNetwork:
        ipv4_address: 172.24.2.6

  driver-service:
    image: driver-service-image
    container_name: driver-service-container
    ports:
      - '3333:3333'
    environment:
      - NOTIFICATION_SERVICE_URL=172.24.2.3:8888
      - PAYMENT_SERVICE_URL=172.24.2.2:7777
      - SECURE_KEY_USERNAME=randomSecureKeyUsername!
      - SECURE_KEY_PASSWORD=randomSecureKeyPassword!
      - KAFKA_GROUP_ID=driver-group-id
      - KAFKA_BOOTSTRAP_SERVERS=broker:29092
      - kafka.consumer.group.id=driver-group-id
      - kafka.consumer.enable.auto.commit=true
      - kafka.consumer.auto.commit.interval.ms=1000
      - kafka.consumer.auto.offset.reset=earliest
      - kafka.consumer.max.poll.records=1
    networks:
      microservicesNetwork:
        ipv4_address: 172.24.2.5

  passenger-service:
    image: passenger-service-image
    container_name: passenger-service-container
    ports:
      - '4444:4444'
    environment:
      - PAYMENT_SERVICE_URL=172.24.2.2:7777
      - SECURE_KEY_USERNAME=randomSecureKeyUsername!
      - SECURE_KEY_PASSWORD=randomSecureKeyPassword!
    networks:
      microservicesNetwork:
        ipv4_address: 172.24.2.4

  notification-service:
    image: notification-service-image
    container_name: notification-service-container
    ports:
      - '8888:8888'
    environment:
      - SECURE_KEY_USERNAME=randomSecureKeyUsername!
      - SECURE_KEY_PASSWORD=randomSecureKeyPassword!
    networks:
      microservicesNetwork:
        ipv4_address: 172.24.2.3

  payment-service:
    image: payment-service-image
    container_name: payment-service-container
    ports:
      - '7777:7777'
    environment:
      - SECURE_KEY_USERNAME=randomSecureKeyUsername!
      - SECURE_KEY_PASSWORD=randomSecureKeyPassword!
    networks:
      microservicesNetwork:
        ipv4_address: 172.24.2.2

  zookeeper:
    image: confluentinc/cp-zookeeper:7.0.1
    container_name: zookeeper
    ports:
      - "2181:2181"
      - "2888:2888"
      - "3888:3888"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    networks:
      - microservicesNetwork

  broker:
    image: confluentinc/cp-kafka:7.0.1
    container_name: broker
    ports:
      - "9092:9092"
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://broker:29092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      GROUP_ID: driver-group-id
      KAFKA_CREATE_TOPICS: "product"
    networks:
      - microservicesNetwork

  kafka-ui:
    image: provectuslabs/kafka-ui
    container_name: kafka-ui
    ports:
      - "8080:8080"
    restart: always
    environment:
      - KAFKA_CLUSTERS_0_NAME=broker
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=broker:29092
      - KAFKA_CLUSTERS_0_ZOOKEEPER=zookeeper:2181
      - KAFKA_CLUSTERS_0_READONLY=true
    networks:
      - microservicesNetwork


  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    platform: linux/x86_64
    environment:
      - discovery.type=single-node
      - max_open_files=65536
      - max_content_length_in_bytes=100000000
      - transport.host= elasticsearch
    volumes:
      - $HOME/app:/var/app
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - microservicesNetwork

  postgresql:
    image: postgres:11.1-alpine
    platform: linux/x86_64
    container_name: postgresql
    volumes:
      - ./postgresql/:/var/lib/postgresql/data/
    environment:
      - POSTGRES_PASSWORD=123456
      - POSTGRES_USER=postgres
      - POSTGRES_DB=cqrs_db
    ports:
      - "5432:5432"
    networks:
      - microservicesNetwork

networks:
  microservicesNetwork:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.24.2.0/16
          gateway: 172.24.2.1

application.prod.properties ->

#datasource
spring.datasource.url=jdbc:h2:mem:db_driver
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
#need spring-security config.
spring.h2.console.enabled=false
spring.h2.console.path=/h2-console
spring.jpa.show-sql=true
service.security.secure-key-username=${SECURE_KEY_USERNAME}
service.security.secure-key-password=${SECURE_KEY_PASSWORD}

payment.service.url=${PAYMENT_SERVICE_URL}
notification.service.url=${NOTIFICATION_SERVICE_URL}

#kafka configs
kafka.bootstrap.servers=${KAFKA_BOOTSTRAP_SERVERS}
kafka.group.id =${KAFKA_GROUP_ID}
spring.cache.cache-names=driver
spring.jackson.serialization.fail-on-empty-beans= false
spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=11MB

如果錯誤顯示localhost/127.0.0.1:9092 ,那么您的環境變量沒有被使用。

在容器的啟動日志中,查看 AdminClientConfig 或 ConsumerConfig 部分,您將看到使用的真實引導地址

KAFKA_BOOTSTRAP_SERVERS=broker:29092根據您的KAFKA_ADVERTISED_LISTENERS是正確的

但是,在您的屬性中,不清楚如何在不顯示您的配置 class 的情況下使用它

kafka.bootstrap.servers=${KAFKA_BOOTSTRAP_SERVERS

如果您仔細閱讀 spring kafka 文檔,您會發現它需要是spring.kafka.bootstrap.servers才能自動連接

旁注:所有這些kafka.consumer. 屬性需要設置為JVM 屬性,而不是容器環境變量。

此外,Docker 服務應配置為通過服務名稱相互通信,而不是分配 IP 地址

問題解決了😊

如果我在本地計算機上運行 driver-service,它實際上是從 localhost:9092 連接的,但是如果 driver-service 和 kafka 在同一個 docker 網絡中,它需要從“KAFKA_IP:29092”連接(可以使用服務名稱代替的KAFKA_IP),對於這種不同的網絡環境,kafka是不同的。 它希望我們配置( Source ),當我在本地計算機上運行我的驅動程序服務應用程序時,kafka 和驅動程序服務可以通信,但它們無法在同一個 docker 網絡中通信。 也就是說,驅動程序服務沒有使用我在 application.prod.properties 文件中定義的 Kafka 連接地址,我的應用程序在 docker 中運行時應該使用該地址。 問題出在我的 spring kafka 集成中,我試圖使用我的屬性文件中的 kafka.bootstrap.servers 鍵為我的客戶端應用程序提供連接到 kafka 的地址,我在我的屬性文件中定義了這個鍵並提取和分配KafkaBean class 中此鍵的值,但客戶端沒有看到它。它一直在嘗試連接到 localhost:9092,首先我在 dockerfile 中使用“ENTRYPOINT [”java”,“-Dspring”指定了我的活動配置文件。 profiles.active=prod", "-jar", "driver-service-0.0.2-SNAPSHOT.jar"]" 命令在 docker 環境中工作時使用我的 application.prod.properties 文件,然后,如果我們使用密鑰如 spring Kafka 文檔( SOURCE )中所述,“spring.kafka.bootstrap-servers”而不是“kafka.bootstrap.servers”,spring 可以自動檢測來自哪些地址 s 它可以連接到 Kafka。 我只需要使用 @Value 注釋給生產者也提供 Kafka 地址,以便驅動程序服務和 Kafka 可以在 docker 網絡中無縫通信😇

非常感謝 @OneCricketeer 和 @Svend 的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM