Spring boot 获得;经纪人可能不在”;spring引导容器尝试连接kafka容器时出错

Spring boot 获得;经纪人可能不在”;spring引导容器尝试连接kafka容器时出错,spring-boot,docker,apache-kafka,Spring Boot,Docker,Apache Kafka,我在spring boot kafka docker上遇到了问题,尝试了下面链接中提到的所有方法,但问题仍然存在 附加我的docker-compose.yml version: '2' services: zookeeper: image: wurstmeister/zookeeper container_name: zookeeper ports: - "2181:2181" kafka: image: wurstmeist

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

附加我的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
错误日志

-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.
我正在运行wrustmiester/kafka和wrustmiester/zookeeper。 如果我在本地运行spring boot应用程序,一切都会顺利运行。
当我尝试构建spring boot应用程序的映像并运行该映像时,问题就出现了。则错误是代理可能不可用。
如果有人能给我指路,请告诉我

添加我的应用程序.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
server:
  port: 8000
spring:
  kafka:
    bootstrap-servers: localhost:9094
    consumer:
      auto-offset-reset: false
    template:
      default-topic: process-topic
.....
将my 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
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
将my application.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
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
错误日志相同

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.

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

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

您的错误来自AdminClient,因此如果您没有在代码中手动创建该客户端的实例,则需要为
spring.kafka.admin.*
添加一个配置部分,其中还设置了引导服务器

或者,如果所有三个客户端都与同一个集群通信,则从生产者和消费者中删除引导服务器,并使用
spring.kafka.bootstrap server

因为您使用的是Docker网络,所以地址必须是Kafka容器的主机名。还要注意的是,
链接
是一种不推荐使用的组合功能,不应该依赖它

您能试一下吗

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
    - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    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
    ports:
      - "8081:8081"
    depends_on:
      - zookeeper
      - kafka
networks:
  default:
    external:
      name: bridge

我能够解决我的问题

这是我更新的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
所做的更改是

  • 我已经使用了融合的卡夫卡和zookeeper,但即使上面的docker-compose.yml与wrustmeister Kafka和zookeeper也可以使用

  • 最重要的财产

    环境: SPRING_KAFKA_BootstrapServer:KAFKA:29092

  • 也正如@OneCricketeer所建议的

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

    我觉得即使这样也行。

    也许我可以稍后再试,并更新我的答案。

    我通过在Spring Boot应用程序中配置KafkaAdmin bean并传递bootstrap servers属性进行了修复:

    @SpringBootApplication
    public class CpoExecutorApplication {
    
        @Value("${spring.kafka.template.default-topic}")
        private String topicName;
    
        @Value("${spring.kafka.bootstrap-servers}")
        private String bootstrapAddress;
    
        @Bean
        public KafkaAdmin kafkaAdmin() {
            Map<String, Object> configs = new HashMap<>();
            configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
            return new KafkaAdmin(configs);
        }
    
        @Bean
        public NewTopic processTopic() {
            return TopicBuilder.name(topicName).partitions(2).build();
        }
    ....
    

    这样,我就不需要在docker compose.yml中传递SPRING_KAFKA_BOOTSTRAPSERVERS环境变量。

    请看,仅仅提供一个链接没有帮助,请告诉我我在哪里犯了错误。如博客中所述,连接到本地主机是不正确的。在应用程序容器中,它指的是应用程序容器,而不是代理。您的制作人和消费者无法连接到app container中的任何内容我是否应该在application.yml中提及引导服务器的主机名:localhost:9092,而不是localhost->kafkaNo您需要使用服务或容器名称访问kafka在本例中为kafka,因此,基本上您应该在应用程序中使用kafka:9092.yml文件是的,我已经将localhost:9092替换为kafka:9092。但问题仍然存在persist@Ajinkya然后编辑您的问题以反映更改和新错误message@OneCricketeer,我已更新问题,错误保持不变。您提到的所有细节都无法帮助我解决问题。你能分享一些代码片段并指出我在配置中的错误吗。此外,没有3个客户端。我有一个spring boot rest应用程序与Apache Kafka通信“您的错误来自AdminClient,因此如果您没有在代码中手动创建该应用程序的实例,则需要为spring.Kafka.admin.*添加一个配置部分,并在其中设置引导服务器”->在docker上运行Kafka和zookeeper图像的情况下,当我在本地运行spring boot应用程序时,同样的代码也会起作用,所以我认为在创建管理实例时没有任何问题。请阅读我的问题,如果我遗漏了任何其他细节,请告诉我。我确实阅读了你的问题。您无法将“在本地运行”与在Docker中运行所有内容进行比较。这么简单——如果您试图将容器部署到其他任何地方(使用Docker的主要目的),它也不会起作用。这个错误清楚地表明,
    localhost
    仍然在代码中的某个地方被使用,并且没有实际看到您的完整spring应用程序,很难说会在哪里,因为您的配置文件没有显示它(除非admin属性默认为localhost,并且您没有提到它的部分)。如果您可以在本地运行所有内容,那么不要在本地使用DockerRunning意味着Spring boot在本地运行,但是Kafka和zookeeper在docker上运行。因此,基本上我的spring boot应用程序与docker图像进行通信。此外,如果你需要任何其他详细信息或配置文件,我准备发布它,让我知道。此外,如果需要,我可以共享我的项目GitHub链接。我的意思是,通常Kafka会在远程集群环境中。(例如,亚马逊MSK)。在这种情况下,您的代码也会有相同的错误。但是是的,这对于完整的stacktrace和创建/使用AdminClient的代码是必要的