Сегодня мы интегрируем наши микросервисы с остальными компонентами системы, протестируем взаимодействие и подготовимся к большому финалу. Let's make it happen!
Объединение компонентов: как собрать архитектурный лего-набор
Представьте, что вы собираете гигантскую мозаику. В предыдущих лекциях мы создавали кусочки этой мозаики: микросервисы с бизнес-логикой, Kafka для обмена событиями, API Gateway для маршрутизации запросов, а Eureka — для поиска сервисов. Сегодня нужно всё это скомпоновать так, чтобы система играла в унисон.
Прежде чем нырять в интеграцию, немного теории: главная задача этапа — наладить коммуникацию между компонентами, проверить их взаимодействие и устранить потенциальные конфликты.
Зависимости
Наша система состоит из следующих компонентов:
- Микросервисы: каждый микросервис выполняет свою роль, например, управление пользователями, обработка заказов.
- Kafka: используется для событийной коммуникации между микросервисами.
- Eureka: сервис-реестр. При старте микросервисы регистрируются в нем, чтобы другие могли их обнаружить.
- API Gateway: центральный маршрутизатор для входящих запросов.
- Мониторинг и логирование: Prometheus, Grafana, ELK.
Интеграция Eureka: регистрация всех сервисов
Мы начнем с Eureka, ведь это сердце нашего сервис-реестра. Все микросервисы должны регистрироваться в нем, а API Gateway — находить их.
Регистрация микросервисов в Eureka
Пример кода для одного из микросервисов (application.properties):
spring.application.name=user-service
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
И, конечно, не забываем добавить зависимость в pom.xml:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Проверка: поднимите Eureka (если еще не подняли) и убедитесь, что ваш микросервис появился в списке зарегистрированных сервисов. Открываем браузер на http://localhost:8761, и там должен быть ваш user-service. Условно, это как видеть своё имя в списке участников конференции. Приятно, правда?
Интеграция API Gateway с Eureka
API Gateway должен уметь перенаправлять запросы к зарегистрированным сервисам. Это настраивается так:
spring:
application:
name: api-gateway
cloud:
gateway:
discovery:
locator:
enabled: true
netflix:
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
Теперь вы можете направлять запросы через Gateway, пользуясь именами микросервисов. Например, запрос http://localhost:8080/user-service/users будет автоматически перенаправлен в user-service.
Связываем Kafka и микросервисы
Чтобы микросервисы могли обмениваться событиями через Kafka, следуем следующим шагам:
1. Подключение продюсеров
На стороне вашего продюсера необходимо настроить отправку сообщений. Например, наш order-service будет информировать другие микросервисы о новых заказах:
2. Настройка консьюмеров
На стороне других микросервисов (например, payment-service) мы принимаем события:
@KafkaListener(topics = "order-events", groupId = "payment-service")
public void listen(String message) {
System.out.println("Получено сообщение: " + message);
// Обработка логики
}
Важный момент: Настройте сериализацию/десериализацию сообщений. Используйте JSON, если хотите сохранить дружелюбие сообщений для чтения.
Проверяем маршруты в API Gateway
После того как Kafka настроена, а Eureka знает о наших сервисах, проверим маршрутизацию. Это один из самых ответственных этапов!
Настройте маршрут в API Gateway:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/users/**
Теперь запрос http://localhost:8080/users/1 перенаправляется в user-service.
Подключаем мониторинг и логирование
Мониторинг — это как ваша система "глаз" в продакшене. Уже настроили базовые сборщики метрик? Теперь важно убедиться, что Prometheus и Grafana видят ваши микросервисы.
Очередной шаг к наблюдаемости — добавление метрик через Actuator. Не забудьте подключить зависимости:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Убедитесь, что метрики доступны на /actuator и экспортируются в Prometheus. Настройте application.properties:
management.endpoints.web.exposure.include=*
management.metrics.export.prometheus.enabled=true
management.metrics.export.prometheus.endpoint=/prometheus
Интеграция с ELK
Ещё важный шаг — централизованное логирование. Установите Logstash и отправляйте логи ваших микросервисов в Elasticsearch:
logging:
file:
name: /var/log/microservices.log
Финальная проверка
После подключения всех компонентов проведите интеграционное тестирование. Коммуникация должна работать следующим образом:
- Пользователь отправляет HTTP-запрос через API Gateway.
- API Gateway перенаправляет запрос в нужный микросервис.
- Микросервис обрабатывает запрос, взаимодействуя с Kafka (если это событие).
- Другие микросервисы реагируют на события из Kafka.
Для тестирования можно использовать Postman или автоматизировать это с помощью тестов на MockMvc.
Распространённые проблемы
- Сервисы "не видят" друг друга. Проверьте настройки Eureka и убедитесь, что все сервисы зарегистрированы.
- Kafka сообщения не доставляются. Проверьте настройки брокера и убедитесь, что топик существует.
- Проблемы с маршрутизацией API Gateway. Убедитесь, что путь в маршруте правильно настроен.
Готово! Ваш архитектурный лего-набор собран. Теперь система объединена в одну архитектуру. Браво!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ