Это вводная статья по использованию Apache Kafka со Spring Boot. О том, как установить и запустить Apache Kafka на Windows, создать топик и отправить туда первое событие из одного Spring Boot приложения. А получить его из другого Spring Boot приложения.
Установка и запуск Kafka
Kafka запускается в ZooKeeper, но отдельно скачивать ZooKeeper не нужно, он идет вместе с Kafka.
Как запустить Kafka под Windows 10
- Сначала нужно загрузить и распаковать tgz-архив.
- Нужно переименовать папку вида kafka_2.13-2.7.0 — дать более короткое имя, например kafka, иначе возникнут проблемы при запуске из консоли
- Открыть Windows PowerShell (либо командную строку cmd.exe, неважно)
- Перейти в переименованную папку kafka (внутри будут папки bin, config и другие папки и файлы)
- Запустить ZooKeeper, набрав в консоли:
.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties
- Открыть вторую консоль, перейти в ту же переименованную папку kafka и запустить Kafka:
.\bin\windows\kafka-server-start.bat .\config\server.properties
Все, Apache Kafka запущен.
Теперь в нем можно создавать топики — как из консоли, так и из Spring Boot. Мы сделаем это из Spring Boot.
У нас будет два Spring Boot приложения. Они совершенно независимы друг от друга. Одно приложение будет отправлять событие в топик (это приложение Producer), а второе — получать их из топика (приложение Consumer).
Mаven-зависимость
Чтобы работать с Kafka, оба приложения (как Producer, так и Consumer) должны иметь зависимость:
<dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency>
Spring Boot Producer
Выглядит приложение просто:
@SpringBootApplication public class ProducerApplication { public static void main(String[] args) { SpringApplication.run(ProducerApplication.class, args); } @Bean public NewTopic topic() { return TopicBuilder.name("topic1") .partitions(10) .replicas(1) .build(); } @Bean public ApplicationRunner runner(KafkaTemplate<String, String> template) { return args -> { template.send("topic1", "test"); }; } }
Бин topic типа NewTopic создает топик topic1, если его нет.
KafkaTemplate отправляет события в топик topic1. У нас это всего одна строка — test.
Перейдем к созданию второго приложения, которое получает события из Kafka.
Spring Boot Consumer
Это приложение слушает топик topic1:
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public NewTopic topic() { return TopicBuilder.name("topic1") .partitions(10) .replicas(1) .build(); } @KafkaListener(id = "myId", topics = "topic1") public void listen(String in) { System.out.println(in); } }
Если в топик приходит событие, то оно выводится в консоль.
То есть в консоль будет выведена одна строка:
test
Приложение Spring Boot Producer завершилось быстро, а Spring Boot Consumer висит и слушает топик. Можно запустить Spring Boot Producer еще раз, тогда в консоли Spring Boot Consumer снова будет выведена строка:
test
Итоги
Код примеров доступен на GitHub.
Источники: