Spring Application在同一集群内运行时无法连接到Kafka,但在从集群外运行时可以工作[重复]

Posted

技术标签:

【中文标题】Spring Application在同一集群内运行时无法连接到Kafka,但在从集群外运行时可以工作[重复]【英文标题】:Spring Application cannot connect to Kafka when it's run inside of the same cluster, but works when it runs from outside cluster [duplicate] 【发布时间】:2022-01-10 17:56:53 【问题描述】:

Spring 应用程序在我的机器上本地运行并通过 docker 访问 Kafka 时工作正常,但是当我将 Spring 应用程序作为容器添加到集群内时它不起作用。我收到错误消息:“无法建立与节点 -1 (localhost/127.0.0.1:9092) 的连接。代理可能不可用”

下面列出的是spring应用的docker-compose、dockerfile和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

Dockerfile

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"]

【问题讨论】:

【参考方案1】:

使用 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 部署设置不同的应用程序配置文件。

【讨论】:

@daniu 链接了一个答案,但现在我只需要一种方法来为应用程序设置环境变量,以便它可以通过 docker-compose 的 dns 系统连接。谢谢顺便说一句

以上是关于Spring Application在同一集群内运行时无法连接到Kafka,但在从集群外运行时可以工作[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Spring, application.properties 用于创建 ElephantSQL 表

两个springboot运行时同一个application的问题

Spring Cloud笔记 Eureka通过集群实现高可用

spring cloud 搭建注册中心Eureka(集群模式)

在同一个 kubernetes 集群中从一个 pod 调用一个 rest api 到另一个 pod

3Spring Cloud - Eureka(高可用Eureka Server集群)