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 и всего, что с ним связано.
ссылка на оригинал статьи https://habr.com/ru/articles/874488/
Добавить комментарий