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

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

Модуль 5. Spring
25 уровень , 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, добавлять фильтры и управлять запросами. Используя эти знания, вы сможете маршрутизировать запросы в микросервисном приложении с учётом всех требований к безопасности и производительности.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ