Spring Boot и Apache Kafka. Введение

Это вводная статья по использованию 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.

Источники:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *