JavaRush /Курси /Модуль 5. Spring /Лекція 244: Практика: маршрутизація запитів через API Gat...

Лекція 244: Практика: маршрутизація запитів через API Gateway

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

Ми розглянули Spring Cloud Gateway як потужний інструмент для реалізації API Gateway. Потім встановили його, додали базові залежності і налаштували перший простий маршрут.

У цій лекції ми створимо конфігурацію маршрутів у Spring Cloud Gateway, які будуть перенаправляти запити до різних мікросервісів. Ми додамо фільтри для обробки запитів і відповідей, реалізуємо обмеження на запити та налаштуємо підтримку CORS (міждоменні запити). Також ми протестуємо нашу конфігурацію, щоб переконатися, що все працює як треба.


1. Налаштування складних маршрутів

Маршрути (routes) — це основа роботи Gateway. Кожен маршрут визначає:

  • Предикати (predicates), які відповідають за те, які запити маршрутизувати (наприклад, фільтрація за шляхом або методом HTTP).
  • Фільтри (filters), які змінюють або доповнюють запити і відповіді.
  • URI, куди перенаправляти запити.

Давайте додамо кілька маршрутів для нашої системи мікросервісів.

Крок 1: Підготовка проекту

Переконайтеся, що у вашому проєкті вже встановлені залежності для Spring Cloud Gateway. Якщо ні, додайте їх у файл pom.xml:


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

Звичайно, не забудьте оновити залежності (наприклад, за допомогою mvn clean install).

Крок 2: Налаштування маршрутів в application.yml

Приклад файлу application.yml з кількома маршрутами:


spring:
  cloud:
    gateway:
      routes:
        - id: user-service-route
          uri: http://localhost:8081
          predicates:
            - Path=/users/**
          filters:
            - StripPrefix=1
        - id: order-service-route
          uri: http://localhost:8082
          predicates:
            - Path=/orders/**
          filters:
            - AddResponseHeader=X-Custom-Header, OrderService
        - id: product-service-route
          uri: lb://product-service
          predicates:
            - Path=/products/**

Тут:

  1. id: Унікальний ідентифікатор маршруту.
  2. uri: Адреса сервісу, куди буде маршрутизуватися запит.
    • Тут http://localhost:8081 означає, що запити на /users/** будуть перенаправлятися на сервіс User Service, який слухає на порті 8081.
    • lb://product-service означає використання балансувальника навантаження (функціонал Eureka, якщо вона інтегрована).
  3. predicates: Умова маршрутизації.
    • Наприклад, Path=/users/** означає, що запити з цим шляхом потраплять до служби користувачів.
  4. filters: Додаткові перетворення запитів і відповідей.
    • StripPrefix=1 видаляє перший сегмент маршруту (/users) перед відправленням запиту на бекенд.
    • AddResponseHeader додає кастомний HTTP-заголовок у відповідь.

Крок 3: Запуск та тестування

Після налаштування маршрутів запустіть застосунок і протестуйте, як він працює:

  • Для User Service: Відправте запит на http://localhost:8080/users/1 і переконайтеся, що він перенаправляється на http://localhost:8081/1.
  • Для Order Service: Переконайтеся, що відповідь містить заголовок X-Custom-Header: OrderService.

Використовуйте Postman або команду curl для тестування:

curl -v http://localhost:8080/users/1
curl -v http://localhost:8080/orders/123

2. Додавання фільтрів

Фільтри дозволяють модифікувати запити і відповіді. Ви можете додавати заголовки, змінювати вміст запитів, а також виконувати аутентифікацію.

Приклад: Логування запитів

Додайте фільтр для логування запитів:


spring:
  cloud:
    gateway:
      routes:
        - id: logging-route
          uri: http://localhost:8081
          predicates:
            - Path=/logging/**
          filters:
            - name: RequestLoggingFilter

Створіть фільтр:


import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
public class RequestLoggingFilter extends AbstractGatewayFilterFactory<RequestLoggingFilter.Config> {

    private static final Logger logger = LoggerFactory.getLogger(RequestLoggingFilter.class);

    public RequestLoggingFilter() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            logger.info("Request Path: " + exchange.getRequest().getPath());
            return chain.filter(exchange);
        };
    }

    public static class Config {
        // Конфігурація фільтра (якщо потрібно)
    }
}

3. Обмеження запитів (Rate Limiting)

Обмеження швидкості запитів дозволяє уникнути перевантаження сервісів. Для цього використовується фільтр RedisRateLimiter.

Крок 1: Додавання залежності Redis

Додайте залежність:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

Крок 2: Налаштування фільтра Rate Limiter

Змініть application.yml:

spring:
  cloud:
    gateway:
      routes:
        - id: rate-limited-route
          uri: http://localhost:8081
          predicates:
            - Path=/rate-limited/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20

Тут:

  • replenishRate: Кількість запитів, яку можна обробляти в секунду.
  • burstCapacity: Максимальна кількість запитів у "черзі".

4. Підтримка CORS (Cross-Origin Resource Sharing)

Якщо ваш фронтенд і бекенд знаходяться на різних доменах, увімкніть підтримку CORS.

Крок 1: Налаштування CORS у конфігурації

Додайте в application.yml:


spring:
  cloud:
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOrigins: "http://localhost:3000"
            allowedMethods:
              - GET
              - POST
              - PUT
              - DELETE

Тепер запити з http://localhost:3000 до вашого Gateway будуть дозволені.


5. Тестування та валідація

  • Перевірте роботу кожного маршруту за допомогою Postman.
  • Переконайтеся, що заголовки додаються правильно.
  • Перевірте обмеження запитів, відправивши багато запитів підряд, і переконайтеся, що зайві блокуються.

6. Типові помилки та як їх уникнути

  1. Помилка 404: маршрут налаштований неправильно. Перевірте умови предикатів.
  2. Відсутність фільтрів: переконайтеся, що фільтри застосувалися до маршруту.
  3. Проблеми з CORS: перевірте правильність allowedOrigins і allowedMethods у конфігурації.

Порада: завжди спочатку перевіряйте логи, щоб побачити, як API Gateway обробляє запити.


Тепер ви знаєте, як налаштовувати складні маршрути через Spring Cloud Gateway, додавати фільтри і керувати запитами. Використовуючи ці знання, ви зможете маршрутизувати запити в мікросервісному застосунку з урахуванням усіх вимог щодо безпеки та продуктивності.

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