Когда мы работаем в микросервисной архитектуре, у нас может быть десятки или сотни сервисов, каждый из которых отвечает за свою часть логики. Статическая конфигурация этих сервисов в API Gateway — это как попытка вручную выстроить очередь из кошек: никто не гарантирует, что завтра сервис не сменит адрес или не появится новый.
Интеграция API Gateway с Eureka позволяет:
- Автоматически обнаруживать микросервисы: Eureka берёт на себя задачу регистрации сервисов и их мониторинга. API Gateway будет запрашивать эту информацию в реальном времени.
- Динамически маршрутизировать запросы: новые сервисы или изменения в существующих автоматически учитываются в маршрутах.
- Упростить управление микросервисами: менее рутинной работы вручную — больше автоматизации.
Подготовка к интеграции
Перед началом интеграции убедитесь, что у вас есть:
- Развёрнутый Eureka Server (он был настроен в предыдущей лекции "Практика: настройка Eureka для обнаружения микросервисов").
- Один или несколько клиентских микросервисов, зарегистрированных в Eureka (например, сервисы
user-serviceиorder-service).
Теперь создадим проект для API Gateway и свяжем его с Eureka Server.
1. Создание проекта для API Gateway
1. Инициализация проекта Используем Spring Initializr для создания нового Spring Boot приложения:
- Dependencies:
- Spring Cloud Gateway
- Eureka Discovery Client
- Spring Boot Actuator (для мониторинга, это опционально, но полезно)
Скачиваем проект и открываем его в любимой среде разработки (например, IntelliJ IDEA).
2. Настройка application.yml
Добавим базовую конфигурацию в наш application.yml для подключения к Eureka Server:
server:
port: 8080 # Порт API Gateway
spring:
application:
name: api-gateway # Имя сервиса в Eureka
cloud:
gateway:
discovery:
locator:
enabled: true # Включаем интеграцию с Eureka
routes:
- id: default_route
uri: lb://placeholder # Это временная заглушка до автоматической маршрутизации.
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # Ссылка на ваш Eureka Server
fetch-registry: true
register-with-eureka: true
Обратите внимание на ключевую часть этой конфигурации:
spring.cloud.gateway.discovery.locator.enabled: true— активирует интеграцию Gateway с Eureka.lb://— это указание Spring использовать Ribbon (Load Balancer) для маршрутизации запросов.
3. Реализация автоматической маршрутизации
Теперь, благодаря включению discovery.locator.enabled, API Gateway автоматически будет считывать информацию о зарегистрированных сервисах из Eureka. Каждый сервис в Eureka становится доступным "по имени". Например:
lb://user-serviceбудет направлять запросы к сервисуuser-service.lb://order-service— кorder-service.
Но чтобы проверить это на практике, давайте добавим один маршрут вручную для тестирования:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/users/**
- id: order-service
uri: lb://order-service
predicates:
- Path=/orders/**
Эти маршруты говорят Gateway направлять:
- Все запросы, начинающиеся с
/users/, к сервисуuser-service. - Все запросы, начинающиеся с
/orders/, к сервисуorder-service.
4. Запуск API Gateway и тестирование
Запускаем наш API Gateway и тестируем маршруты. Убедитесь, что ваши сервисы user-service и order-service зарегистрировались в Eureka Server и работают.
Тестирование с помощью *Postman или curl*
- Запрос:
Ожидаемый результат: запрос будет перенаправлен на
curl -X GET http://localhost:8080/users/alluser-serviceи вы получите список всех пользователей (или ошибку, если сервис настроен неверно). - Запрос:
Ожидаемый результат: запрос будет перенаправлен на
curl -X GET http://localhost:8080/ordersorder-service.
Если всё работает, значит интеграция прошла успешно!
5. Отладка и мониторинг
Для отладки интеграции вы можете использовать Spring Boot Actuator. Добавьте в application.yml следующую конфигурацию:
management:
endpoints:
web:
exposure:
include: "*"
Теперь вы можете проверить /actuator/gateway/routes для вывода списка всех маршрутов в API Gateway, которые обнаружены через Eureka.
Пример команды для проверки:
curl http://localhost:8080/actuator/gateway/routes
6. Расширенная конфигурация
Вы также можете настроить фильтры для обработки запросов. Например, если нужно добавить заголовок ко всем запросам:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/users/**
filters:
- AddRequestHeader=X-Service, UserService
Теперь любой запрос к user-service будет автоматически содержать заголовок X-Service: UserService.
Чтобы защитить сервисы от перегрузки, можно настроить ограничение скорости запросов (rate-limiting):
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/users/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # Запросов в секунду
redis-rate-limiter.burstCapacity: 20
Частые проблемы и их решения
- Eureka Server недоступен: если API Gateway не может подключиться к Eureka, убедитесь, что Eureka Server запущен, и его адрес указан корректно в
application.yml. - Микросервис не регистрируется: убедитесь, что в
application.ymlваших микросервисов настроена корректная регистрация в Eureka. - Ошибки маршрутизации: проверьте конфигурацию маршрутов в
/actuator/gateway/routesи убедитесь, что указан корректныйuri.
Поздравляю! Теперь ваш API Gateway стал умным, благодаря интеграции с Eureka. Вы не только упростили маршрутизацию запросов, но и сделали систему гибкой к изменениям в микросервисах. Мы продолжим развивать ваши навыки в следующих лекциях, до встречи!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ