Spring 启动应用无法在 Docker 中将事件发布到 Kafka
Spring Boot app is not able to publish events to Kafka in Docker
各位程序员大家好!
我正在学习 Docker 和 Kafka,如果有任何帮助,我将不胜感激。问题是应用程序能够连接到 Kafka,但不能发布任何事件。错误:
org.apache.kafka.common.errors.TimeoutException: Expiring 2 record(s) for wages-local-0:120001 ms has passed since batch creation
当 Spring 一个 Docker 容器中的启动应用程序尝试发布到另一个容器中的 Kafka 时,会出现此问题:
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
container_name: kafka
hostname: kafka
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://kafka:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
depends_on:
- zookeeper
publisher_app:
build:
context: ./kafka-publisher
ports:
- 8080:8080
depends_on:
- "kafka"
environment:
kafka.wages-topic.bootstrap-address: kafka:9092
links:
- kafka:kafka
这里是 link 源代码:https://github.com/aleksei17/springboot-rest-kafka-mysql/blob/master/docker-compose.yml
您的配置被硬编码为使用 localhost:9092
您想 externalize the config 像这样(删除 kafka.wages-topic
部分,因为 bootstrap 服务器不是特定主题的设置)
spring:
kafka:
bootstrap-servers: ${BOOTSTRAP_SERVERS}
然后在撰写中,
environment:
BOOTSTRAP_SERVERS: kafka:9092
要配置主题,请参阅 https://docs.spring.io/spring-kafka/reference/html/#configuring-topics
嗯,看来我需要在使用后删除容器。当我这样做时,我在启动 Kafka 容器时遇到错误,如:unknown listener PLAINTEXT
。所以我将 PLAINTEXT 更改为 INTERNAL,它起作用了!这是 docker-compose for Kafka 的最终版本:
kafka:
image: wurstmeister/kafka
container_name: kafka
hostname: kafka
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://kafka:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
depends_on:
- zookeeper
如果它既适用于 Docker 化的应用程序,又适用于 Docker 以外的同一主机上的应用程序 运行,那就太好了,但这是另一回事。玩过本教程,但到目前为止没有成功:https://www.baeldung.com/kafka-docker-connection
各位程序员大家好!
我正在学习 Docker 和 Kafka,如果有任何帮助,我将不胜感激。问题是应用程序能够连接到 Kafka,但不能发布任何事件。错误:
org.apache.kafka.common.errors.TimeoutException: Expiring 2 record(s) for wages-local-0:120001 ms has passed since batch creation
当 Spring 一个 Docker 容器中的启动应用程序尝试发布到另一个容器中的 Kafka 时,会出现此问题:
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
container_name: kafka
hostname: kafka
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://kafka:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
depends_on:
- zookeeper
publisher_app:
build:
context: ./kafka-publisher
ports:
- 8080:8080
depends_on:
- "kafka"
environment:
kafka.wages-topic.bootstrap-address: kafka:9092
links:
- kafka:kafka
这里是 link 源代码:https://github.com/aleksei17/springboot-rest-kafka-mysql/blob/master/docker-compose.yml
您的配置被硬编码为使用 localhost:9092
您想 externalize the config 像这样(删除 kafka.wages-topic
部分,因为 bootstrap 服务器不是特定主题的设置)
spring:
kafka:
bootstrap-servers: ${BOOTSTRAP_SERVERS}
然后在撰写中,
environment:
BOOTSTRAP_SERVERS: kafka:9092
要配置主题,请参阅 https://docs.spring.io/spring-kafka/reference/html/#configuring-topics
嗯,看来我需要在使用后删除容器。当我这样做时,我在启动 Kafka 容器时遇到错误,如:unknown listener PLAINTEXT
。所以我将 PLAINTEXT 更改为 INTERNAL,它起作用了!这是 docker-compose for Kafka 的最终版本:
kafka:
image: wurstmeister/kafka
container_name: kafka
hostname: kafka
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://kafka:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
depends_on:
- zookeeper
如果它既适用于 Docker 化的应用程序,又适用于 Docker 以外的同一主机上的应用程序 运行,那就太好了,但这是另一回事。玩过本教程,但到目前为止没有成功:https://www.baeldung.com/kafka-docker-connection