Как стать автором
Обновить
74.23

Event-driven микросервисы с использованием Spring Boot и Kafka

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров850
Автор оригинала: Eleftheria Drosopoulou

Event-driven архитектура - один из видов архитектур, который подходит для обеспечения независимости, масштабируемости и устойчивости микросервисов. 

В новом переводе от команды Spring АйО вы в легкодоступной форме узнаете, как построить такую архитектуру, используя Apache Kafka и Spring Boot, а также ознакомитесь с пошаговой настройкой продюсеров, консьюмеров, решением задач надежности и управлением схемами.


Event-driven архитектура идеально подходит для микросервисов, так как она разделяет их, делая более масштабируемыми и устойчивыми. Apache Kafka в сочетании с Spring Boot предоставляет прочную основу для проектирования таких систем. Kafka выполняет функции системы обмена сообщениями, позволяя микросервисам взаимодействовать через события вместо прямых HTTP-запросов, что улучшает надежность, масштабируемость и скорость ответа.

В этой статье мы рассмотрим, как спроектировать и реализовать архитектуру микросервисов на основе event-driven с использованием Spring Boot и Kafka, включая настройку Kafka, создание продюсеров и консьюмеров, а также решение распространенных задач в таких системах.

1. Что такое архитектура на основе событий?

В event-driven системах микросервисы взаимодействуют путем генерации и обработки событий. Каждый сервис реагирует на события, вместо того чтобы ожидать прямых запросов от других сервисов. Такой подход позволяет микросервисам масштабироваться независимо и справляться с ошибками более эффективно, так как сервисы слабо связаны между собой.

Пример: В приложении для электронной коммерции при создании заказа можно опубликовать событие «Order Placed». Другие сервисы, такие как сервис управления запасами или сервис обработки платежей, потребляют это событие и выполняют соответствующие действия.

2. Почему Kafka подходит для микросервисов на основе событий?

Apache Kafka — это распределенная потоковая платформа, разработанная для обработки высоконагруженных потоков событий с низкой задержкой. Вот ключевые особенности Kafka, полезные для микросервисов:

  • Масштабируемость: Kafka обрабатывает миллионы событий в секунду и поддерживает горизонтальное масштабирование.

  • Отказоустойчивость: Благодаря распределенной архитектуре Kafka обеспечивает устойчивость через репликацию данных.

  • Хранение событий: Kafka может хранить события в течение заданного времени, что позволяет повторно проигрывать их при необходимости.

3. Настройка Kafka и Spring Boot

Установка Kafka:

Скачайте и запустите сервер Kafka. Для работы также потребуется Zookeeper.

# Запуск Zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
# Запуск Kafka
bin/kafka-server-start.sh config/server.properties

Добавление зависимостей:

Добавьте необходимые зависимости в pom.xml или build.gradle.

<!-- pom.xml -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

4. Создание продюсера Kafka в Spring Boot

Создадим сервис заказов, который публикует события в Kafka при создании нового заказа. В этом примере сервис отправляет событие «Order Created» в топик Kafka.

Конфигурация Kafka:

Добавьте настройки в application.yml.

spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer

Сервис продюсера:

Создайте класс KafkaProducerService для отправки сообщений в Kafka.

import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

@Service
public class KafkaProducerService {

    private final KafkaTemplate<String, String> kafkaTemplate;

    public KafkaProducerService(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendOrderEvent(String orderId) {
        kafkaTemplate.send("order-topic", orderId);
        System.out.println("Order event sent for order ID: " + orderId);
    }
}

Здесь используется KafkaTemplate для отправки сообщений в топик Kafka. При создании заказа метод sendOrderEvent отправляет orderId в топик order-topic.

5. Создание консьюмера Kafka в Spring Boot

Другие сервисы, например сервис управления инвентарем, могут подписаться на топик order-topic и обрабатывать новые события.

Конфигурация консьюмера:

Добавьте настройки консьюмера в application.yml.

spring:
  kafka:
    consumer:
      group-id: inventory-group
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

Сервис-консьюмер:

Создайте класс KafkaConsumerService для обработки событий.

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

@Service
public class KafkaConsumerService {

    @KafkaListener(topics = "order-topic", groupId = "inventory-group")
    public void processOrderEvent(ConsumerRecord<String, String> record) {
        String orderId = record.value();
        System.out.println("Received order event for order ID: " + orderId);
        // Обновление инвентаря на основе нового заказа
    }
}

С помощью аннотации @KafkaListener сервис получает сообщения из топика order-topic и обрабатывает каждое событие.

6. Обеспечение надежности событий

В реальных приложениях важно гарантировать надежность обработки сообщений. Kafka предоставляет механизмы для этого:

  • Подтверждения (Acknowledgments): Установите подтверждения (acks) в all для гарантий надежности.

spring:
  kafka:
    producer:
      acks: all
  • Повторы и обработка ошибок: Настройте повторы для обработки временных сбоев.

spring:
  kafka:
    consumer:
      enable-auto-commit: false
      max-poll-records: 10
    listener:
      ack-mode: manual

В этом сценарии консьюмеры вручную подтверждают сообщения, гарантируя, что события не будут потеряны из-за ошибок.

7. Преимущества Event-Driven микросервисов с Kafka и Spring Boot

  • Масштабируемость: Каждый сервис может масштабироваться независимо, так как Kafka распределяет сообщения, позволяя нескольким экземплярам обрабатывать события одновременно.

  • Устойчивость: Репликация данных в Kafka предотвращает их потерю при сбое брокера.

  • Асинхронное взаимодействие: Сервисы производят и потребляют события асинхронно, что ускоряет отклик и улучшает user experience.

8. Версионирование событий и эволюция схем

По мере развития микросервисов структура событий может изменяться. Использование реестра схем (например, Confluent Schema Registry) помогает управлять эволюцией схем.

Пример: Если в событие «Order Created» нужно добавить поле customerId, вы можете обновить схему, сохранив совместимость с консьюмерами, которым это поле не нужно.

9. Заключение

Event-Driven Микросервисы с использованием Spring Boot и Kafka предлагают масштабируемую и устойчивую архитектуру, подходящую для современных облачных приложений. Разделение сервисов и асинхронное взаимодействие делают систему более гибкой и отзывчивой. Следуйте этим шагам и используйте передовые практики для эффективного проектирования микросервисов, а также учитывайте управление схемами для поддержания надежности событий по мере роста вашего приложения.

Присоединяйтесь к русскоязычному сообществу разработчиков на Spring Boot в телеграм - Spring АйО, чтобы быть в курсе последних новостей из мира разработки на Spring Boot и всего, что с ним связано.

Теги:
Хабы:
+1
Комментарии1

Публикации

Информация

Сайт
t.me
Дата регистрации
Численность
11–30 человек