Як архітектури мікросервісів стають нормою, потреба в ефективному зв’язку між сервісами стає все важливішою. Одним з найпотужніших інструментів у екосистемі Spring Cloud є Spring Cloud Gateway, розумний API шлюз, побудований на основі Spring WebFlux. Цей інструмент призначений для виконання складного завдання маршрутизації та фільтрації запитів у розподілених системах. У цьому блозі я детально розгляну деякі з його основних можливостей, чому він важливий і як ви можете використовувати його у своїх проєктах.
Spring Cloud Gateway
Чому Spring Cloud Gateway?
Spring Cloud Gateway надає комплексний і гнучкий спосіб маршрутизації та управління запитами між сервісами. Це покращення традиційних методів маршрутизації, з акцентом на неблокуючий ввід/вивід (non-blocking I/O) через Reactor та Netty. У порівнянні з попередником, Zuul, Spring Cloud Gateway пропонує:
- Неблокуюча асинхронна архітектура: побудована на Spring WebFlux, вона ефективно обробляє запити асинхронно, що робить її підходящою для сучасних, високопродуктивних вебзастосунків.
- Розширені можливості маршрутизації: динамічне зіставлення маршрутів з гнучкими предикатами та переписуванням шляхів.
- Вбудоване балансування навантаження: підтримує різні стратегії балансування навантаження, такі як кругова маршрутизація (round-robin) та зважені відповіді.
- Перерви ланцюга та повтори: інтегровано з Spring Cloud Circuit Breaker, це додає стійкість вашим сервісам через обробку помилок.
- Безпека та автентифікація: вбудована інтеграція з Spring Security для автентифікації та авторизації.
Основні можливості Spring Cloud Gateway
1. Визначення маршрутів та динамічна маршрутизація
Spring Cloud Gateway дозволяє вам визначати конфігурації маршрутів декларативно через application.yml
або програмно. Ви можете здійснювати зіставлення маршрутів на основі шляхів, HTTP методів, заголовків і багато іншого. Наприклад, можна створювати фільтри маршрутів, що додають заголовки, переписують шляхи або навіть обмежують запити для контролю потоку трафіку.
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://example.com
predicates:
- Path=/api/**
filters:
- AddRequestHeader=Custom-Header, CustomValue
Цей маршрут перенаправляє запити, що починаються з
/api/
, наhttps://example.com
і додає заголовокCustom-Header
.
2. Інтеграція з Circuit Breaker
Одна з найважливіших функцій для побудови стійких систем — це шаблон перерви ланцюга (circuit breaker). Spring Cloud Gateway безшовно інтегрується з Resilience4j або Hystrix, дозволяючи вам елегантно обробляти помилки сервісів і уникати каскадних відмов.
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackuri: forward:/fallback
Якщо сервіс не відповідає, запит перенаправляється на
/fallback
, що може бути іншим мікросервісом або простою відповіддю з помилкою.
3. Обмеження швидкості запитів
Щоб захистити ваші сервіси від перевантаження, Spring Cloud Gateway включає вбудовану підтримку обмеження швидкості запитів (rate limiting). Ця функція дозволяє визначити власні політики для обмеження запитів, гарантуючи, що жоден клієнт чи маршрут не споживатиме всі ресурси.
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter:
replenishRate: 10
burstCapacity: 20
Це гарантує, що кожен клієнт може зробити максимум 10 запитів за секунду та може «вибухати» до 20 запитів.
4. Інтеграція з Spring Security
Безпека критична для будь-якої розподіленої системи, і Spring Cloud Gateway спрощує інтеграцію механізмів автентифікації та авторизації. Ви можете інтегрувати його з OAuth 2.0, JWT або іншими протоколами безпеки через Spring Security.
spring:
security:
oauth2:
client:
registration:
my-client:
client-id: your-client-id
client-secret: your-client-secret
Вище наведено приклад використання OAuth2 для безпеки. Spring Cloud Gateway безшовно працює з Spring Security, дозволяючи автентифікацію та авторизацію для захисту ваших маршрутів.
5.
Глобальні фільтри
Spring Cloud Gateway дозволяє використовувати глобальні фільтри, які застосовуються до всіх маршрутів. Це корисно для виконання завдань, таких як ведення журналу, перевірка запитів або моніторинг.
@Bean
public GlobalFilter customGlobalFilter() {
return (exchange, chain) -> {
System.out.println("Global Filter: " + exchange.getRequest().getURI());
return chain.filter(exchange);
};
}
Це дозволить реєструвати URI запиту для кожного вхідного запиту, що проходить через шлюз.
Приклад використання: API шлюз у архітектурі мікросервісів
У типовій конфігурації мікросервісів, API шлюз, такий як Spring Cloud Gateway, служить точкою входу для зовнішніх клієнтів. Він обробляє перехресні завдання, такі як безпека, балансування навантаження та маршрутизація. Ось практичний сценарій:
- Управління маршрутами: Ви визначаєте маршрути для кожного мікросервісу (наприклад,
/orders
,/products
), що дозволяє шлюзу направляти трафік відповідно до запитів клієнтів. - Стійкість: Перерви ланцюга (circuit breakers) гарантують, що якщо сервіс, наприклад
OrdersService
, виходить з ладу, шлюз автоматично перенаправить трафік до резервного сервісу, зберігаючи доступність. - Безпека: Ви можете автентифікувати користувачів через шлюз, використовуючи Spring Security, забезпечуючи, щоб лише авторизовані запити потрапляли до мікросервісів.
Висновок
Spring Cloud Gateway — це важливий компонент у сучасних хмарних додатках. Його здатність обробляти неблокуючий ввід/вивід, інтегруватися з компонентами Spring Cloud і надавати вбудовану підтримку для складних шаблонів, таких як перерви ланцюга (circuit breaking) і обмеження швидкості запитів (rate limiting), робить його незамінним для масштабованих, стійких архітектур мікросервісів. Якщо ви тільки починаєте або хочете оптимізувати вашу існуючу систему, Spring Cloud Gateway пропонує гнучке та потужне рішення для маршрутизації та управління запитами API.
Подальше читання
Перекладено з: 🧗Exploring Spring Cloud Gateway: A Modern Approach to API Routing and Microservice Communication