JavaRush /Курси /Модуль 5. Spring /Лекція 248: Інтеграція Eureka з API Gateway

Лекція 248: Інтеграція Eureka з API Gateway

Модуль 5. Spring
Рівень 24 , Лекція 7
Відкрита

Коли ми працюємо в мікросервісній архітектурі, у нас може бути десятки або сотні сервісів, кожен із яких відповідає за свою частину логіки. Статична конфігурація цих сервісів в API Gateway — це як спроба вручну побудувати чергу з котів: ніхто не гарантує, що завтра сервіс не змінить адресу або не з'явиться новий.

Інтеграція API Gateway з Eureka дає змогу:

  1. Автоматично виявляти мікросервіси: Eureka бере на себе задачу реєстрації сервісів і їхнього моніторингу. API Gateway буде запитувати цю інформацію в реальному часі.
  2. Динамічно маршрутизувати запити: нові сервіси або зміни в існуючих автоматично підхоплюються в маршрутах.
  3. Спростити управління мікросервісами: менше рутинної ручної роботи — більше автоматизації.

Підготовка до інтеграції

Перед початком інтеграції переконайся, що в тебе є:

  • Розгорнутий 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/all
    
    Очікуваний результат: запит буде перенаправлено на user-service і ти отримаєш список усіх користувачів (або помилку, якщо сервіс налаштований неправильно).
  • Запит:
    curl -X GET http://localhost:8080/orders
    
    Очікуваний результат: запит буде перенаправлено на order-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

Поширені проблеми та їхні рішення

  1. Eureka Server недоступний: якщо API Gateway не може підключитися до Eureka, переконайся, що Eureka Server запущений і його адреса вказана коректно в application.yml.
  2. Мікросервіс не реєструється: переконайся, що в application.yml твоїх мікросервісів налаштована коректна реєстрація в Eureka.
  3. Помилки маршрутизації: перевір конфігурацію маршрутів через /actuator/gateway/routes і впевнись, що вказаний коректний uri.

Вітаю! Тепер твій API Gateway став розумнішим завдяки інтеграції з Eureka. Ти не тільки спростив маршрутизацію запитів, але й зробив систему гнучкішою до змін у мікросервісах. Ми продовжимо прокачувати твої навички в наступних лекціях, до зустрічі!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ