Соединение с узлом -1 (localhost/127.0.0.1:9092) не удалось установить в Spring Kafka

Я добавил Spring Kafka в свое приложение Spring и ожидал, что оно заработает, но получил

INFO     [           main] o.a.kafka.common.utils.AppInfoParser     : Kafka version: 3.4.1
INFO --- [           main] o.a.kafka.common.utils.AppInfoParser     : Kafka commitId: 8a516edc2755df89
INFO --- [           main] o.a.kafka.common.utils.AppInfoParser     : Kafka startTimeMs: 1694915576434
INFO --- [| adminclient-1] org.apache.kafka.clients.NetworkClient   : [AdminClient clientId=adminclient-1] Node -1 disconnected.
WARN --- [| 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.

Я добавила это в свой pom.xml

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
    <version>3.0.9</version>
</dependency>

и настроил его

@Bean
public KafkaAdmin kafkaAdmin() {
    Map<String, Object> configs = new HashMap<>();
    configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
    return new KafkaAdmin(configs);
}

@Bean
public NewTopic checkInTopic() {
    return new NewTopic(checkInTopicName, 1, (short) 1);
}

где bootstrapAddress настраивается через application.yml:

spring:  
  kafka:
    bootstrap-servers: localhost:9092

и у меня также есть конфигурация производителя:

@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
    return new KafkaTemplate<>(producerFactory());
}

@Bean
public ProducerFactory<String, String> producerFactory() {
    return new DefaultKafkaProducerFactory<>(Map.of(
            ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress,
            ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class,
            ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class
    ));
}

В чем дело? Должен ли я запустить Kafka вручную на порту локального хоста 9092? Я предполагаю, что это делается автоматически средой Spring, так как мне не нужно развертывать его на tomcat, потому что он включен в комплект. Запускается ли служба Kafka или мне нужно сделать это самому?

Да, вам нужно установить и запустить экземпляр Kafka. Артефакт spring-kafka имеет только API, а не весь Kafka.

Marc Le Bihan 17.09.2023 04:47

Отсутствовала ли документация, в которой говорилось, что Kafka не следует запускать в первую очередь? Вы следуете конкретному руководству? Как можно объяснить это другим, предполагающим то же самое?

OneCricketeer 17.09.2023 15:50

В первом предложении раздела 2 говорится о загрузке и установке Kafka, прежде чем что-либо делать с maven/Spring.

OneCricketeer 18.09.2023 04:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, вам придется запустить Kafka вручную на порту локального хоста 9092.

Модуль spring-kafka содержит API-интерфейсы Kafka, необходимые для выполнения операций с темами, производителями и потребителями Kafka.

Примечание. Модуль Spring-Kafka поставляется со встроенным Kafka, но его можно использовать только для тестовых классов на основе Spring Kafka через аннотацию @EmbeddedKafka . См. здесь, например, о том, как писать тестовые классы Kafka с этой аннотацией.

По этой причине вам необходимо настроить/установить работающий экземпляр Kafka на вашем локальном компьютере, чтобы ваше приложение могло подключиться и использовать его.

Теперь это полностью зависит от вашего варианта использования. Посмотрите, какой вариант использования вам больше подходит.


С другой стороны, вам нужно будет загрузить и настроить Apache Kafka в вашей системе.

Есть два варианта запуска службы Kafka: с помощью устаревшего Zookeeper и более нового KRaft.

Режим KRaft более масштабируем, чем режим ZooKeeper, что позволяет кластерам Kafka обрабатывать больше трафика и данных. Режим KRaft работает быстрее, чем режим ZooKeeper, что приводит к меньшей задержке и более высокой пропускной способности.

Начальные шаги те же.

  1. Загрузите последнюю версию Kafka здесь.
  2. Перейдите к bin/ в каталоге kafka.

Крафт

Продолжение шагов:

  1. Создайте проект, используя ./gradlew jar -PscalaVersion=2.13.10
  2. Создайте UUID кластера KAFKA_CLUSTER_ID = "$(./kafka-storage.sh random-uuid)"
  3. Форматирование каталогов журналов ./kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c ../config/kraft/server.properties
  4. Измените log.dirs, чтобы он указывал на другой допустимый каталог вместо /tmp/kraft-combined-logs.
  5. Запустите брокер Kafka. ./kafka-server-start.sh ../config/kraft/server.properties

Для Windows существует папка windows с пакетными сценариями, соответствующими сценариям оболочки Linux/Mac.

Работник зоопарка

Продолжение шагов:

  1. Запустите Zookeeper.

    • Linux/Mac: ./zookeeper-server-start.sh ../config/zookeeper.properties
    • Окна: windows\zookeeper-server-start.bat ..\..\config\zookeeper.properties
  2. Отредактируйте файл server.properties.

    • Раскомментируйте эту строку кода: listeners=PLAINTEXT://localhost:9092, чтобы включить прослушивание брокера на этом сокете.
    • Измените log.dirs, чтобы он указывал на другой допустимый каталог вместо /tmp/kafka-logs.
  3. Запустите брокер Kafka.

    • Linux/Mac: ./kafka-server-start.sh ../config/server.properties
    • Окна: windows\kafka-server-start.bat ..\..\config\server.properties

Это все, что касается первоначальной настройки.


Посетите здесь, чтобы прочитать дополнительную информацию о создании тем и других вещах, связанных с Кафкой.

Теперь приложение Spring сможет подключаться к Kafka.

Последняя версия Kafka не требует Zookeeper, и настройки прослушивателей по умолчанию подходят. log.dirs следует изменить, чтобы не использовать /tmp

OneCricketeer 17.09.2023 15:51

@OneCricketeer О! Тогда почему у Кафки до сих пор есть этот скрипт Zookeeper? Просто интересуюсь..

Anish B. 17.09.2023 17:24

@АнишБ. Оказывается, Kafka находится в процессе перехода с Zookeeper на KRaft. KRaft более масштабируем и быстрее, чем Zookeeper. Я отредактирую ответ так, чтобы он также показывал способ использования KRaft, потому что мы хотим побудить людей использовать KRaft вместо устаревшего Zookeeper.

banan3'14 18.09.2023 00:24

@banan3'14 Конечно. Спасибо. :)

Anish B. 18.09.2023 03:09

Скрипты будут там до Kafka 4.0, когда они будут полностью удалены. Будет период миграции. Кроме того, EmbeddedKafka является частью Spring-kafka, поэтому технически он поставляется с двоичными файлами Kafka, по крайней мере, для целей тестирования, но я думаю, его также можно попытаться использовать в качестве встроенного брокера/надежной шины сообщений.

OneCricketeer 18.09.2023 04:16

Другие вопросы по теме