Spring 应用程序在 运行 同一集群内时无法连接到 Kafka,但在 运行 来自外部集群时可以连接
Spring Application cannot connect to Kafka when it's run inside of the same cluster, but works when it runs from outside cluster
Spring 应用程序在我的机器上本地运行并通过 docker 访问 Kafka 时工作正常,但是当我将我的 Spring 应用程序添加为容器时它不起作用集群内部。我收到错误消息:“无法建立与节点 -1 (localhost/127.0.0.1:9092) 的连接。代理可能不可用”
下面列出了 docker-compose、docker文件和 spring 应用程序的 application.properties。
docker-compose.yml
version: "3"
services:
zookeeper:
image: 'bitnami/zookeeper:latest'
ports:
- '2181:2181'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: 'bitnami/kafka:latest'
ports:
- '9092:9092'
environment:
- KAFKA_BROKER_ID=1
- KAFKA_LISTENERS=PLAINTEXT://:9092
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zookeeper
app:
image: 'someuser/imagename'
ports:
- '8080:8080'
depends_on:
- kafka
applications.properties
server.port = 8080
spring.kafka.consumer.bootstrap.servers=localhost:9092
spring.kafka.consumer.group-id=mygroup
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consume.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.producer.bootstrap-servers=localhost:9092
spring.kafka.producer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.producer.value-deserialzier=org.apache.kafka.common.serialization.StringDeserializer
Docker 文件
FROM openjdk:17
WORKDIR /app
EXPOSE 8080
EXPOSE 9092
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY src ./src
CMD ["./mvnw", "spring-boot:run"]
使用 spring.kafka.producer.bootstrap-servers=localhost:9092 和 spring.kafka.consumer.bootstrap.servers=localhost:9092 您的应用程序在技术上是在端口 9092 上调用它自己的容器,而不是部署 kafka 的容器上。
如果您将 localhost:9092 更改为 kafka:9092,它应该可以工作 (https://docs.docker.com/compose/networking/)。 (在本地它不会,但它应该在通过 docker 部署时连接)
尝试为本地和 docker 部署设置不同的应用程序配置文件。
Spring 应用程序在我的机器上本地运行并通过 docker 访问 Kafka 时工作正常,但是当我将我的 Spring 应用程序添加为容器时它不起作用集群内部。我收到错误消息:“无法建立与节点 -1 (localhost/127.0.0.1:9092) 的连接。代理可能不可用”
下面列出了 docker-compose、docker文件和 spring 应用程序的 application.properties。
docker-compose.yml
version: "3"
services:
zookeeper:
image: 'bitnami/zookeeper:latest'
ports:
- '2181:2181'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: 'bitnami/kafka:latest'
ports:
- '9092:9092'
environment:
- KAFKA_BROKER_ID=1
- KAFKA_LISTENERS=PLAINTEXT://:9092
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zookeeper
app:
image: 'someuser/imagename'
ports:
- '8080:8080'
depends_on:
- kafka
applications.properties
server.port = 8080
spring.kafka.consumer.bootstrap.servers=localhost:9092
spring.kafka.consumer.group-id=mygroup
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consume.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.producer.bootstrap-servers=localhost:9092
spring.kafka.producer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.producer.value-deserialzier=org.apache.kafka.common.serialization.StringDeserializer
Docker 文件
FROM openjdk:17
WORKDIR /app
EXPOSE 8080
EXPOSE 9092
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY src ./src
CMD ["./mvnw", "spring-boot:run"]
使用 spring.kafka.producer.bootstrap-servers=localhost:9092 和 spring.kafka.consumer.bootstrap.servers=localhost:9092 您的应用程序在技术上是在端口 9092 上调用它自己的容器,而不是部署 kafka 的容器上。
如果您将 localhost:9092 更改为 kafka:9092,它应该可以工作 (https://docs.docker.com/compose/networking/)。 (在本地它不会,但它应该在通过 docker 部署时连接)
尝试为本地和 docker 部署设置不同的应用程序配置文件。