Какие реализации паттерна API Gateway используются в Spring Cloud
Что проверяют
Знаете ли вы, что в экосистеме Spring актуально сейчас, а что осталось в старых статьях. Следом обычно спрашивают, как настроить маршрут с балансировкой и ограничением частоты или как шлюз проверяет токен.
Как отвечать
Сам паттерн: единая точка входа для клиентов, которая берёт на себя маршрутизацию и сквозные задачи: аутентификацию, лимиты, CORS, ретраи, логирование. Реализации в Spring Cloud:
- Spring Cloud Gateway на WebFlux: основной вариант, работает на Netty, неблокирующий. Модель из трёх понятий: маршрут (route), предикаты (
Path,Host,Header,Method,Weight) и фильтры (StripPrefix,RewritePath,AddRequestHeader,Retry,CircuitBreakerчерез Resilience4j,RequestRateLimiterс Redis,TokenRelay). Маршруты задаются в YAML или Java DSL черезRouteLocatorBuilder, свои фильтры черезGlobalFilterилиGatewayFilterFactory; - Spring Cloud Gateway Server MVC: тот же подход на сервлетном стеке. Удобен командам без реактивного опыта, а с виртуальными потоками Java 21 блокирующая модель уже не так дорога. В последних релизах стартеры разделены на варианты
server-webfluxиserver-webmvc; - Zuul 1 из Spring Cloud Netflix: исторический вариант на блокирующих сервлетах. Давно в режиме поддержки и удалён из релиз-трейна 2020.0, встречается только в легаси.
Для балансировки URI маршрута пишут как lb://order-service, адрес берётся из Eureka, Consul или Kubernetes через Spring Cloud LoadBalancer. Безопасность строится на Spring Security как OAuth2 Resource Server: шлюз проверяет JWT и передаёт его дальше.
Уместно оговориться, что в Kubernetes шлюзом часто служит не Spring, а ingress-контроллер или реализация Gateway API.
Где спотыкаются
Называют Zuul равноправной альтернативой. На нём давно не начинают новых проектов, и сравнивать его с Gateway сегодня незачем.
Пишут в фильтрах реактивного Gateway блокирующий код: JDBC, RestTemplate, block(). Поток event loop занят, и под нагрузкой встаёт весь шлюз.
Складывают в шлюз бизнес-логику и агрегацию данных из десятка сервисов. Он превращается в распределённый монолит и единую точку отказа, которую страшно деплоить.