Я добавил 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 не следует запускать в первую очередь? Вы следуете конкретному руководству? Как можно объяснить это другим, предполагающим то же самое?
В первом предложении раздела 2 говорится о загрузке и установке Kafka, прежде чем что-либо делать с maven/Spring.




Да, вам придется запустить Kafka вручную на порту локального хоста 9092.
Модуль spring-kafka содержит API-интерфейсы Kafka, необходимые для выполнения операций с темами, производителями и потребителями Kafka.
Примечание. Модуль Spring-Kafka поставляется со встроенным Kafka, но его можно использовать только для тестовых классов на основе Spring Kafka через аннотацию @EmbeddedKafka . См. здесь, например, о том, как писать тестовые классы Kafka с этой аннотацией.
По этой причине вам необходимо настроить/установить работающий экземпляр Kafka на вашем локальном компьютере, чтобы ваше приложение могло подключиться и использовать его.
Теперь это полностью зависит от вашего варианта использования. Посмотрите, какой вариант использования вам больше подходит.
С другой стороны, вам нужно будет загрузить и настроить Apache Kafka в вашей системе.
Есть два варианта запуска службы Kafka: с помощью устаревшего Zookeeper и более нового KRaft.
Начальные шаги те же.
bin/ в каталоге kafka.Продолжение шагов:
./gradlew jar -PscalaVersion=2.13.10KAFKA_CLUSTER_ID = "$(./kafka-storage.sh random-uuid)"./kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c ../config/kraft/server.propertieslog.dirs, чтобы он указывал на другой допустимый каталог вместо /tmp/kraft-combined-logs../kafka-server-start.sh ../config/kraft/server.propertiesДля Windows существует папка windows с пакетными сценариями, соответствующими сценариям оболочки Linux/Mac.
Продолжение шагов:
Запустите Zookeeper.
./zookeeper-server-start.sh ../config/zookeeper.propertieswindows\zookeeper-server-start.bat ..\..\config\zookeeper.propertiesОтредактируйте файл server.properties.
listeners=PLAINTEXT://localhost:9092, чтобы включить прослушивание брокера на этом сокете.log.dirs, чтобы он указывал на другой допустимый каталог вместо /tmp/kafka-logs.Запустите брокер Kafka.
./kafka-server-start.sh ../config/server.propertieswindows\kafka-server-start.bat ..\..\config\server.propertiesЭто все, что касается первоначальной настройки.
Посетите здесь, чтобы прочитать дополнительную информацию о создании тем и других вещах, связанных с Кафкой.
Теперь приложение Spring сможет подключаться к Kafka.
Последняя версия Kafka не требует Zookeeper, и настройки прослушивателей по умолчанию подходят. log.dirs следует изменить, чтобы не использовать /tmp
@OneCricketeer О! Тогда почему у Кафки до сих пор есть этот скрипт Zookeeper? Просто интересуюсь..
@АнишБ. Оказывается, Kafka находится в процессе перехода с Zookeeper на KRaft. KRaft более масштабируем и быстрее, чем Zookeeper. Я отредактирую ответ так, чтобы он также показывал способ использования KRaft, потому что мы хотим побудить людей использовать KRaft вместо устаревшего Zookeeper.
@banan3'14 Конечно. Спасибо. :)
Скрипты будут там до Kafka 4.0, когда они будут полностью удалены. Будет период миграции. Кроме того, EmbeddedKafka является частью Spring-kafka, поэтому технически он поставляется с двоичными файлами Kafka, по крайней мере, для целей тестирования, но я думаю, его также можно попытаться использовать в качестве встроенного брокера/надежной шины сообщений.
Да, вам нужно установить и запустить экземпляр Kafka. Артефакт
spring-kafkaимеет только API, а не весь Kafka.