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