Коли ми працюємо в мікросервісній архітектурі, у нас може бути десятки або сотні сервісів, кожен із яких відповідає за свою частину логіки. Статична конфігурація цих сервісів в 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. Ти не тільки спростив маршрутизацію запитів, але й зробив систему гнучкішою до змін у мікросервісах. Ми продовжимо прокачувати твої навички в наступних лекціях, до зустрічі!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ