Post

API Gateway в микросервисной архитектуре

API Gateway в микросервисной архитектуре

Что такое API Gateway?

API Gateway — это компонент, через который проходят все внешние запросы в микросервисной архитектуре. Он выполняет роль входной двери в систему и решает задачи маршрутизации, безопасности, фильтрации и трекинга запросов.

Другими словами, Gateway:

  • Cлужит единой точкой входа в распределенную систему;
  • Перенаправляет запросы к нужным микросервисам;
  • Выполняет сквозные (cross-cutting) задачи: логирование, авторизация и др;
  • Упрощает клиентам взаимодействие с системой, скрывая ее внутреннюю структуру.

На практике Gateway помогает сделать архитектуру более устойчивой, управляемой и безопасной.

Ограничения прямого взаимодействия с микросервисами

На начальном этапе может показаться удобным подключать фронтенд или внешних клиентов напрямую к каждому микросервису. Когда все сервисы запущены в одной сети, например через docker-compose, это действительно может работать.

Однако по мере роста системы и числа микросервисов такой подход становится все менее жизнеспособным:

  • Клиенту приходится знать адреса и порты всех микросервисов, что нарушает принцип инкапсуляции и усиливает связанность компонентов.
  • Задачи безопасности, логирования и аудита приходится реализовывать и поддерживать в каждом сервисе отдельно.
  • Сложная маршрутизация по ролям, заголовкам и параметрам запроса требует дублируемой логики. Т.е. если необходимо направлять запросы в разные сервисы в зависимости от ролей пользователя, заголовков, параметров или версии API — такую динамическую маршрутизацию приходится реализовывать вручную в каждом сервисе, что ведет к дублированию логики и увеличивает технический долг.
  • Каждый сервис должен самостоятельно решать задачи отказоустойчивости (timeouts, retries, circuit breakers).

Такой подход не масштабируется и становится источником технического долга. Поэтому в зрелой архитектуре вводится единая точка входа — API Gateway. На определенном этапе становится ясно: нам нужен единый вход в систему, или по-другому — Edge Server / API Gateway.

⚠️Термин Edge Server (дословно — “краевой сервер”) означает, что этот компонент располагается на границе системы, принимая внешний трафик и передавая его внутрь. Он отделяет внешний мир от внутренних сервисов и служит входной точкой в систему.

Какие задачи решает API Gateway

В микросервисной архитектуре существует набор задач, которые повторяются во всех сервисах и не относятся напрямую к бизнес-логике. Эти задачи называются сквозными (cross-cutting concerns). Их целесообразно централизовать — и именно этим занимается API Gateway.

Какие это задачи:

  • Request Validation — проверка корректности входящих запросов до передачи в микросервис (например, структура, обязательные поля).
  • Include & Exclude List — фильтрация доступа на основе списков разрешенных и запрещенных клиентов (IP, user-agent, tenant ID и т.п.).
  • Authentication & Authorization — централизованная проверка токенов, ролей и прав доступа.
  • Rate Limiting — ограничение частоты запросов от клиента для защиты от перегрузок и атак.
  • Exception Handling — единообразная обработка ошибок и возврат понятных ответов клиенту.
  • Circuit Breaker — механизм, который предотвращает избыточные попытки обращения к сбойному сервису. Если сервис не отвечает (например, возвращает ошибки или не укладывается в таймаут), Gateway временно разрывает цепочку вызовов и сразу возвращает предсказуемый ответ клиенту, не нагружая систему повторными обращениями. Это помогает защитить всю систему от перегрузки, особенно когда множество клиентов одновременно пытаются достучаться до недоступного сервиса.
  • Logging / Monitoring — сбор логов и метрик о входящих запросах, интеграция с системами мониторинга.
  • Caching — кэширование часто запрашиваемых данных на уровне Gateway для снижения нагрузки на микросервисы.

Кроме того, можно выделить ряд инфраструктурных задач:

  • Service Discovery — автоматическое определение доступного экземпляра нужного микросервиса на основе регистрационной службы (например, Eureka). Вместо того чтобы жестко прописывать адреса сервисов, Gateway обращается к реестру, чтобы узнать, куда именно нужно отправить запрос — с учетом масштабирования, отказов и обновлений.
  • Dynamic Routing — маршрутизация запросов в зависимости от заголовков, версий API, URI-шаблонов и других условий.
  • Modify Request/Response — изменение заголовков или тела запроса/ответа. Это нужно, например, чтобы добавить технические заголовки (например, X-Request-ID), удалить лишние данные перед передачей клиенту или адаптировать формат между системами.
  • Protocol Conversion — шлюз между несовместимыми протоколами. Например, когда клиент отправляет REST-запрос, а внутренний сервис работает по gRPC — Gateway берет на себя трансляцию между ними. Это позволяет согласовать работу разных компонентов без изменений в их коде.

Если эти задачи реализовывать на уровне каждого микросервиса, код начнет дублироваться, сложность будет возрастать, надежность системы при этом будет снижаться.

Поэтому такие задачи выносятся в API Gateway, который выступает в роли Edge Server или Policy Enforcement Point (PEP) — посредника, который проверяет и применяет правила перед тем, как запрос попадет внутрь системы.

На практике в качестве API Gateway чаще всего используют Spring Cloud Gateway.

Spring Cloud Gateway

Одной из самых популярных реализаций API Gateway в экосистеме Spring является Spring Cloud Gateway. Это современный реактивный фреймворк, позволяющий быстро организовать надежный шлюз для микросервисной архитектуры.

Spring Cloud Gateway выполняет роль центральной точки входа в систему. Все внешние запросы сначала проходят через него, где они могут быть проверены, модифицированы, логированы и перенаправлены во внутренние сервисы.

Ключевые особенности Spring Cloud Gateway:

  • Основан на Spring WebFlux и Reactor, поддерживает неблокирующую реактивную модель.
  • Интегрируется с Eureka, Resilience4j, Prometheus и другими компонентами Spring Cloud.
  • Позволяет легко настраивать фильтры, маршруты и правила обработки запросов через application.yml или Java DSL.
  • Поддерживает все задачи, описанные выше: маршрутизацию, безопасность, ограничение нагрузки, кеширование, логирование, трансформацию данных и многое другое.

Spring Cloud Gateway легко разворачивается как обычное Spring Boot-приложение.

Внутренне устройство Spring Cloud Gateway

Spring Cloud Gateway обрабатывает каждый входящий HTTP-запрос через четко структурированную цепочку, состоящую из нескольких этапов.

1. Определение маршрута (Routing)

Когда приходит HTTP-запрос, Gateway сначала проверяет, подходит ли он под один из заранее настроенных маршрутов. Это происходит через тн предикаты — условия, которые должны быть выполнены, чтобы маршрут сработал. Например:

  • путь запроса начинается с /api/,
  • в заголовке есть X-User-Role=admin,
  • используется определенный HTTP-метод(POST и тд).

Если ни один маршрут не подходит, Gateway возвращает ошибку (404 Not Found или 403 Forbidden), в зависимости от конфигурации.

⚠️ Предикаты — это первый уровень фильтрации, еще до передачи запроса в цепочку фильтров.

2. Фильтры до передачи запроса (Pre-filters)

Когда маршрут найден, запрос передается через набор Pre-filters — фильтров, которые обрабатывают запрос до его отправки в целевой микросервис. Среди них могут быть:

  • Логирование — запись информации о входящих запросах для мониторинга и аудита.
  • Аутентификация и проверка токена — валидация JWT или другого механизма авторизации.
  • Модификация заголовков — добавление технических заголовков (например, X-Request-ID для трейсинга) или удаление ненужных.
  • Rate limiting — ограничение частоты запросов, чтобы защитить внутренние сервисы от перегрузки.
  • Перенаправление или трансформация запроса — например, изменение пути или параметров до отправки.

Pre-filters позволяют централизовать сквозную логику и упростить реализацию в микросервисах.

3. Передача запроса в микросервис

После обработки всеми пред-фильтрами запрос отправляется в целевой микросервис, определенный на этапе маршрутизации. В это время Gateway выступает как reverse proxy — проксирует запрос, сохраняя подключение клиента.

4. Фильтры после получения ответа (Post-filters)

Когда микросервис возвращает ответ, Gateway запускает цепочку Post-filters, которые могут:

  • Логировать ответ — например, статус и время обработки.
  • Модифицировать тело ответа — оборачивать данные в стандартный формат JSON, добавлять метаинформацию.
  • Удалять или изменять заголовки — например, скрывать внутренние заголовки сервиса перед отправкой клиенту.
  • Кешировать ответ — если это настроено.

⚠️ Благодаря реактивной модели Spring WebFlux, Gateway обрабатывает запросы неблокирующим образом, что повышает его производительность и масштабируемость — особенно при большом числе одновременных соединений.

Шаблоны использования API Gateway

API Gateway реализует несколько архитектурных паттернов в зависимости от задач системы. Рассмотрим основные из них.

API Gateway Pattern

Что это: Базовый шаблон, в котором Gateway служит единой точкой входа для всех клиентов (web, mobile, API) и маршрутизирует запросы к соответствующим микросервисам.

Когда применять:

  • Нужно скрыть внутреннюю структуру системы от клиентов.
  • Требуется централизованное управление кросс-сервисными задачами: безопасность, логирование, аудит.
  • Клиенты не должны знать адреса отдельных сервисов.

Gateway Routing Pattern

Что это: Расширение базового паттерна, когда Gateway выполняет динамическую маршрутизацию запросов к разным микросервисам на основе:

  • URL-пути (например, /api/profiles/**),
  • заголовков запроса,
  • параметров запроса (например, версия API).

Когда применять:

  • Есть разные версии API, и необходимо маршрутизировать запросы без изменения клиента.
  • Требуется отправлять запросы разных типов на разные микросервисы.

Gateway Offloading Pattern

Что это: Паттерн, при котором Gateway берет на себя сквозные задачи (cross-cutting concerns), разгружая микросервисы. Например:

  • Аутентификация и авторизация.
  • Rate limiting (ограничение запросов).
  • Load balancing (балансировка нагрузки).
  • SSL termination (завершение TLS). -Кеширование и мониторинг.

Когда применять:

  • Нужно упростить микросервисы, оставив им только бизнес-логику.
  • Требуется централизованная реализация безопасности и инфраструктурных задач.

Backend for Frontend (BFF) Pattern

Что это: В этом шаблоне создается отдельный Gateway для каждого типа клиента (web, mobile, tablet). Каждый такой gateway адаптирует API под нужды своего клиента.

Когда применять:

  • Требуется разное представление данных или состав API для web и mobile.
  • Нужно минимизировать трафик для мобильных клиентов (например, отдавать сокращенные DTO).
  • Есть разные команды разработки фронтендов, которым удобнее работать с отдельными Gateway.

Gateway Aggregator / Composition Pattern

Что это: Gateway агрегирует данные от нескольких микросервисов в единый ответ. Например, при запросе профиля пользователя нужно получить данные из:

  • сервиса пользователей (основная информация),
  • сервиса заказов (последние покупки),
  • сервиса уведомлений.

Gateway сам вызывает все нужные сервисы и собирает данные в одну структуру, вместо того чтобы клиент делал несколько запросов.

Когда применять:

  • Нужно уменьшить количество запросов от клиента.
  • Требуется собрать комплексный ответ с данными из разных источников.
  • Важно скрыть внутренние детали разбиения системы.

Статьи серии

This post is licensed under CC BY 4.0 by the author.