Какая основная роль Spring Cloud Gateway?
- Зачем нужен API Gateway?
Spring Cloud Gateway — L7-шлюз на входе в систему: маршрутизация по пути, хосту и заголовкам к сервисам и сквозные политики — аутентификация, rate limiting, повторы, circuit breaker, CORS, переписывание путей.
- Маршрут = предикаты (когда) + фильтры (что сделать) + адрес сервиса
- Классический вариант — на WebFlux и Netty; есть вариант на Spring MVC (Gateway Server MVC)
- Не класть в шлюз бизнес-логику — он становится узким местом и общей точкой изменений
А ещё Альтернативы: nginx, Envoy, Kong, ingress Kubernetes
Подробно
Задачи шлюза:
- маршрутизация —
/api/orders/**→ сервис заказов,/api/users/**→ пользователи; по заголовкам — канареечные версии; - аутентификация на входе — проверка JWT один раз, передача пользователя сервисам в заголовке;
- ограничение частоты —
RequestRateLimiterс Redis; - устойчивость — таймауты, повторы, circuit breaker на маршрут;
- преобразования — переписывание путей, добавление заголовков, CORS;
- наблюдаемость — единая точка метрик и трассировки входящего трафика.
Устройство: маршрут состоит из предикатов (Path, Host, Method, Header, Weight) и цепочки фильтров. Адрес — URL или lb://orders (через service discovery и клиентскую балансировку).
Реализация: исходный Gateway работает на WebFlux (Netty) — неблокирующий, держит много соединений. С 2023 года есть Gateway Server MVC на сервлетном стеке.
Чего не делать: бизнес-логику и агрегацию данных в шлюзе — он общий для всех команд и превращается в монолит на входе. Для агрегации под клиента — отдельный BFF.
Выбор: если весь стек на Spring и нужна гибкая логика на Java — Spring Cloud Gateway; если нужна максимальная производительность и инфраструктурное управление — Envoy, nginx, ingress-контроллер.
Пример
spring.cloud.gateway.routes:
- id: orders
uri: lb://orders
predicates: [Path=/api/orders/**]
filters:
- StripPrefix=1
- name: CircuitBreaker
args: { name: orders, fallbackUri: forward:/fallback/orders }Что хотят услышать
- Задачи шлюза.
- Предикаты, фильтры, маршруты.
- Чего не делать в шлюзе, BFF.
Частые ошибки
- Складывать бизнес-логику в шлюз.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Компилировать Java-код в bytecode
- ✗Хранить JPA-сущности и кэшировать их общими для всех сервисов
- ✓Маршрутизировать трафик к сервисам и применять общие политики
- ✗Заменять unit-тесты
Что спросят дальше
- Что такое predicate и filter в Gateway?
- Чем gateway отличается от service mesh?
Разбор темы
- Spring Cloud: config, discovery, gateway, tracing
Config Server, Eureka/DiscoveryClient, Spring Cloud Gateway и распределённая трассировка.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.