Приложение Spring Boot с Apache Kafka

Выбор правильной системы обмена сообщениями во время архитектурного планирования всегда является сложной задачей, но одним из наиболее важных соображений, которые необходимо решить. Разработчики ежедневно пишут приложения, которые должны обслуживать множество пользователей и обрабатывать огромные объемы данных в режиме реального времени.

Для этого удобно использовать Java с Spring Framework (Spring Boot, Spring Data, Spring Cloud, Spring Caching и т. д.).

Spring Boot — это фреймворк, который позволяет проходить процесс разработки намного быстрее и проще, чем раньше. Поскольку число пользователей может быстро расти, можно увидеть очевидную потребность в чем-то, что могло бы обрабатывать до 1 000 000 событий в секунду.

Когда мы нашли Apache Kafka® , мы увидели, что он отвечает нашим потребностям и может быстро обрабатывать миллионы сообщений. Вот почему мы решили попробовать. И с того момента Kafka стал жизненно важным инструментом. Почему именно Kafka, спросите вы?

Apache Kafka это:

  • Масштабируемость
  • Отказоустойчивой
  • Отличная система обмена сообщениями с публикацией и подпиской
  • Возможность более высокой пропускной способности по сравнению с большинством систем обмена сообщениями
  • Очень прочный
  • Высокая надежность
  • Высокая производительность

Вот почему разумное решение использовать его в своих проектах. Предлагаем здесь рассмотреть пошаговое руководство о том, как включить Apache Kafka в ваше приложение Spring Boot, чтобы вы тоже могли начать использовать его преимущества.

Что вы узнаете из этого руководства

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

И с этого, давайте начнем!

Шаг 1: Создайте наш проект

Сначала давайте перейдем к Spring Initializr, чтобы сгенерировать наш проект. Наш проект будет иметь поддержку Spring MVC/web и Apache Kafka.

Создайте проект Spring Boot с помощью Spring Initializr

Как только вы распакуете проект, у вас будет очень простая структура. В конце этой статьи мы покажем вам, как будет выглядеть проект, чтобы вы могли легко следовать той же структуре. Мы используем Intellij IDEA, но вы можете использовать любую Java IDE.

Шаг 2: Публикуйте/читайте сообщения из темы Kafka

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

Начните с создания простого Java-класса, который мы будем использовать для нашего примера: package com.demo.models;

Copy
public class User {


    private String name;
    private int age;


    public User(String name, int age) {
        this.name = name;
        this.age = age;

    }
}

Шаг 3: Настройте Kafka с помощью application.yml

Далее нам нужно создать конфигурационный файл. Нам нужно каким-то образом настроить нашего производителя и потребителя Kafka, чтобы они могли публиковать и читать сообщения в теме и из нее.

Вместо того, чтобы создавать класс Java, помечая его аннотацией @Configuration, мы можем использовать либо файл application.properties, либо application.yml. Spring Boot позволяет нам избежать всего шаблонного кода, который мы использовали для написания в прошлом, и предоставляет нам гораздо более интеллектуальный способ настройки нашего приложения, например, такой:

server: port: 9000
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.apache.kafka.common.serialization.StringDeserializer
     producer:
        bootstrap-servers: localhost:9092
        key-serializer: org.apache.kafka.common.serialization.StringSerializer
        value-serializer: org.apache.kafka.common.serialization.StringSerializer

Для получения полного списка доступных свойств конфигурации вы можете обратиться к официальной документации.

Шаг 4: Создайте продюсера

Создав продюсера, мы будем писать наши сообщения в эту тему.

@Service
public class Producer {

    private static final Logger logger = LoggerFactory.getLogger(Producer.class);
    private static final String TOPIC = "users";

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    public void sendMessage(String message) {
        logger.info(String.format("#### -> Producing message -> %s", message));
        this.kafkaTemplate.send(TOPIC, message);
    }

}

Мы просто автоматически подключили KafkaTemplate и будем использовать этот экземпляр для публикации сообщений в теме — вот и все для производителя!

Шаг 5: Создайте потребителя

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

@Service
public class Consumer {

    private final Logger logger = LoggerFactory.getLogger(Producer.class);

    @KafkaListener(topics = "users", groupId = "group_id")
    public void consume(String message) throws IOException {
        logger.info(String.format("#### -> Consumed message -> %s", message));
    }
}

Здесь мы указали нашему методу void consume (String message) подписаться на тему пользователя и просто отправлять каждое сообщение в журнал приложения. В вашем реальном приложении вы можете обрабатывать сообщения так, как того требует ваш бизнес.

Шаг 6: Создайте контроллер REST

Если у нас уже есть потребитель, то у нас уже есть все, что нам нужно, чтобы иметь возможность использовать сообщения Kafka.

Чтобы полностью показать, как работает все, что мы создали, нам нужно создать контроллер с одной конечной точкой. Сообщение будет опубликовано на этой конечной точке, а затем обработано нашим производителем.

Затем наш потребитель перехватит и обработает его так, как мы его настроили, войдя в консоль.

@RestController 
@RequestMapping (значение = "/ kafka") 
открытый класс KafkaController { 

   частный окончательный продюсер-производитель; 

   @Autowired 
   KafkaController (производитель-производитель) { 
       this.producer = производитель; 
   } 

   @PostMapping(value = "/publish") 
   public void sendMessageToKafkaTopic(@RequestParam("message") String message) { 
       this.producer.sendMessage(message); 
   } 
}

Давайте отправим наше сообщение в Kafka с помощью cURL:

curl -X POST -F 'сообщение=тест' http://localhost:9000/kafka/publish

Добавьте Apache Kafka в свой проект Spring Boot.

В принципе, вот и все! Менее чем за 10 шагов вы узнали, как легко добавить Apache Kafka в свой проект Spring Boot. Если вы следовали этому руководству, теперь вы знаете, как интегрировать Kafka в свой проект Spring Boot, и вы готовы к работе с этим суперинструментом!