Spring Boot App 拒绝连接到 Kafka 代理

Posted

技术标签:

【中文标题】Spring Boot App 拒绝连接到 Kafka 代理【英文标题】:Spring Boot App refuses to connect to the Kafka brokers 【发布时间】:2020-08-13 16:21:20 【问题描述】:

所以我最近才开始使用 Kafka,但出于某种奇怪的原因,尽管 kafka 和 zookeeper 服务器容器按照文档中的预期运行并使用命令 docker ps。我不断收到此特定错误

我已经尝试使用不同的配置解决这个问题大约一个星期了,但它仍然让我不断循环错误。

我遵循了这两个教程: https://rmoff.net/2018/08/02/kafka-listeners-explained/ 和 https://www.youtube.com/watch?v=-0vrqMMGQbc

docker-compose up 运行良好,代理启动,但是当我启动 mvn spring-boot:run 命令时它失败了。

我也尝试通过我的本地机器更改地址,但仍然没有。希望得到一些帮助

这是我的 docker-compose.yml

version: '3.2'
services:
  zookeeper:
    container_name: zookeeper
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
  kafka:
    container_name: kafka
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: INTERNAL://:19092,EXTERNAL://:9092
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:19092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
    depends_on:
      - zookeeper
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

这是我的 application.yml

# Server
server:
  port: 8090

# Spring Kafka & H2
spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration
  kafka:
    bootstrap-servers: localhost:9092
  h2:
    console:
      enabled: true
      path: /h2
  datasource:
    url: jdbc:h2:mem:api;MODE=mysql
    username: api
    password: root
    driverClassName: org.h2.Driver

result:
  topic.name: result

# Keycloak
keycloak:
  auth-server-url: http://localhost:8080/auth
  realm: demo
  resource: demo-api
  enabled: false
  public-client: false
  bearer-only : true
  principal-attribute: preferred_username
  allow-any-hostname: true

#  credentials:
#    secret:

# Logging
logging:
  level:
    org.springframework.web: DEBUG
    org.hibernate: DEBUG
    org: INFO
    com.API.demo.Controllers: DEBUG
  config: src/main/resources/logback-spring.xml
  file:
    path: logs/log

【问题讨论】:

不知道这是否会导致问题,但在您撰写的 kafka 服务中,我会将环境变量放在引号中。值中有很多字符可能会吓坏它。 您正在使用来自 Confluent docker 镜像 (cp-kafka) 的环境变量和不同的镜像。您打算使用哪一个?您的 Spring 代码是在 Docker 主机本地运行,还是在容器中运行? J.Scott,我之前只尝试过 3 个环境变量,就像 youtube 示例一样,但遗憾的是它仍然有同样的错误。还有@RobinMoffatt,我正在使用wurstmeister,我看到一些gitrepos使用相同的图像和环境变量,在我克隆它们后它们运行良好,是的,它在本地运行,而不是在容器中。 【参考方案1】:

Advertised Listener 定义不正确

代替

  KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:19092

你需要

  KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:19092,EXTERNAL://localhost:9092

另请注意,如果您希望代理自动创建主题,您需要设置

  KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'

【讨论】:

可悲的是还是同样的错误,我也配置了一个 kafkaadmin 这就是我禁用 create_topic 的原因 您在进行更改后是否重新启动了代理?重新启动它后,代理日志中的adverted.listeners 是什么? (docker logs kafka|grep listener) 抱歉这个愚蠢的问题,但我在哪里可以找到 docker 的日志文件?我试图在目录中找到它,但它似乎不存在

以上是关于Spring Boot App 拒绝连接到 Kafka 代理的主要内容,如果未能解决你的问题,请参考以下文章

docker compose:spring boot连接到mysql数据库被拒绝

可怕的 Java Spring Boot 应用程序未使用 Docker-compose java.net.ConnectException 连接到 MySQL:连接被拒绝

带有反应式 mongodb 的 Spring Boot 不断尝试连接到 localhost

是否可以将 Spring Boot 应用程序部署到 App Engine 并连接到数据库?

Spring Boot 应用在部署到 Google App Engine 时无法连接到 Google Cloud SQL (PostgreSQL)

将 Spring Boot 应用程序连接到 Google Cloud 中的 MySQL 数据库