Мы рассмотрели 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/**
Здесь:
id: Уникальный идентификатор маршрута.uri: Адрес сервиса, куда будет маршрутизироваться запрос.- Здесь
http://localhost:8081означает, что запросы на/users/**будут перенаправляться на сервисUser Service, который слушает на порту 8081. lb://product-serviceозначает использование балансировщика нагрузки (функционал Eureka, если она интегрирована).
- Здесь
predicates: Условие маршрутизации.- Например,
Path=/users/**означает, что запросы с этим путём попадут на службу пользователей.
- Например,
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. Типичные ошибки и как их избежать
- Ошибка 404: маршрут не настроен правильно. Проверьте условия предикатов.
- Отсутствие фильтров: убедитесь, что фильтры применились к маршруту.
- Проблемы с CORS: проверьте правильность
allowedOriginsиallowedMethodsв конфигурации.
Совет: всегда сначала проверяйте логи, чтобы увидеть, как API Gateway обрабатывает запросы.
Теперь вы знаете, как настраивать сложные маршруты через Spring Cloud Gateway, добавлять фильтры и управлять запросами. Используя эти знания, вы сможете маршрутизировать запросы в микросервисном приложении с учётом всех требований к безопасности и производительности.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ