Spring Boot 容器尝试连接 kafka 容器时出现“Broker 可能不可用”错误

Aji*_*ode 5 apache-kafka docker spring-boot

我遇到了 spring boot kafka docker 的问题,尝试了下面链接中提到的所有内容,但问题仍然存在。

Spring Boot容器无法连接到Kafka容器

附上我的 docker-compose.yml

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
    - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    ports:
    - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
  my-app:
    image: my-app
    container_name: my-app
    ports:
      - "8081:8081"
    depends_on:
      - zookeeper
      - kafka
Run Code Online (Sandbox Code Playgroud)

错误日志

-1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
my-app     | 2020-11-03 08:10:21.444  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.
Run Code Online (Sandbox Code Playgroud)

我正在运行 wrustmiester/kafka 和 wrustmiester/zookeeper。如果我在本地运行 spring boot 应用程序,一切都会顺利进行。
当我尝试构建 Spring Boot 应用程序的映像并运行该映像时,问题就出现了。然后错误是 Broker 可能不可用。
如果有人可以指导我,请。

添加我的 application.yml

spring:
  kafka:
    consumer:
      bootstrap-servers: localhost:9092
      group-id: group_id
      auto-offset-reset: earliest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      #org.apache.kafka.common.serialization.StringDeserializer
      properties.spring.json.trusted.packages: com.myapp.pojo

    producer:
      bootstrap-servers: localhost:9092
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
      #org.apache.kafka.common.serialization.StringSerializer
Run Code Online (Sandbox Code Playgroud)

将我的 docker-compose.yml 更新为

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    network_mode: bridge
    ports:
    - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    network_mode: bridge
    ports:
    - "9092:9092"
    hostname: kafka
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
     # KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9094
     # KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
     # KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ADVERTISED_PORT: 9092
    links:
      - zookeeper
  my-app:
    image: my-app
    container_name: my-app
    network_mode: bridge
    ports:
      - "8081:8081"
    depends_on:
      - zookeeper
      - kafka
Run Code Online (Sandbox Code Playgroud)

将我的 application.yml 更新为

spring:
  kafka:
    consumer:
      bootstrap-servers: kafka:9092
      group-id: group_id
      auto-offset-reset: earliest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      #org.apache.kafka.common.serialization.StringDeserializer
      properties.spring.json.trusted.packages: com.myapp.pojo

    producer:
      bootstrap-servers: kafka:9092
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
      #org.apache.kafka.common.serialization.StringSerializer
Run Code Online (Sandbox Code Playgroud)

错误日志是一样的

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.
my-app     | 2020-11-03 17:05:39.585  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.
Run Code Online (Sandbox Code Playgroud)

Aji*_*ode 5

我能够解决我的问题。

这是我更新的 docker-compose.yml ,它可以工作,其余配置与上面相同

version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - 9092:9092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

  my-app:
    image: my-app
    container_name: my-app
    environment:
      SPRING_KAFKA_BOOTSTRAPSERVERS: kafka:29092
    ports:
      - "8081:8081"
    depends_on:
      - kafka
Run Code Online (Sandbox Code Playgroud)

所做的更改是

  1. 我已经使用了汇合的卡夫卡和动物园管理员,但即使是上面的 docker-compose.yml 与 wrustmeister 卡夫卡和动物园管理员也可以工作。

  2. 最重要的财产

    环境:SPRING_KAFKA_BOOTSTRAPSERVERS:kafka:29092

  3. 也正如 @OneCricketeer 所建议的

或者,如果所有三个客户端都与同一个集群通信,请从生产者和消费者中删除引导服务器,并使用 spring.kafka.bootstrap-servers 进行全局设置

我觉得即使这样也应该有效。
也许我可以稍后尝试这个并更新我的答案。


Ans*_*rma -1

我以几乎相同的方式做了同样的事情(差别很小),只需看看下面的撰写文件,如果这对您有用

version: '3'

services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - 2181:2181
  kafka:
    image: wurstmeister/kafka
    ports:
      - 9092:9092
    hostname: kafka
    environment:
      - KAFKA_ADVERTISED_HOST_NAME=kafka
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_ADVERTISED_PORT=9092
    links:
      - zookeeper
Run Code Online (Sandbox Code Playgroud)