[英]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
我查看了這些資源,但根據它們,我的方法應該有效:
我的 Python/Java/Spring/Go/Whatever 客戶端無法連接到 Docker/AWS/我兄弟筆記本電腦中的 Apache Kafka 集群。 請幫忙
我的 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.