API Gateway¶
API Gateway - единая точка входа в систему для внешних клиентов. Клиент знает один адрес, а gateway решает, в какой сервис отправить запрос, и по пути берёт на себя сквозные задачи: роутинг, аутентификацию, rate limiting, circuit breaker. Единая точка входа - логически, а не физически, тк может быть несколько инстансов за load balancer.
Клиент знает только про gateway. Gateway знает про сервисы, но не их IP, а имена: адрес живого инстанса он спрашивает у registry (см. Service Discovery).
Что делает API Gateway¶
- клиенту не надо знать про десяток сервисов и их адреса: один endpoint, один auth-контракт
- одна точка для метрик и WAF
- сервисы можно делить, переименовывать и переносить, а внешний API остаётся прежним
Задачи:¶
Роутинг - по пути, хосту, методу или заголовку gateway выбирает сервис по url.
- адрес сервиса берётся из service discovery
- запрос по пути можно переписать: срезать префикс
/api, добавить заголовок, сменить путь - маршрут с весами отправляет часть трафика на новую версию: «5% на v2» для канареечного релиза
- снаружи REST и JSON, внутри gRPC: роутинг заодно транслирует протокол
Аутентификация на входе - gateway проверяет токен авторизации до того, как запрос дошёл до сервиса. Нет токена -
сразу 401, нагрузка внутрь не идёт. JWT проверяется локально
- токен уходит дальше в заголовке
Authorization, или gateway обменивает внешний токен на внутренний, узкий по scope - авторизацию gateway не заменяет: он не знает бизнес-контекст, чей это заказ и в каком он статусе
- сервисы всё равно проверяют токен сами
Rate limiting на входе - не больше N запросов в окно времени на
клиента. Превысил - 429 Too Many Requests.
- ключ лимита на gateway - пользователь из токена, API-ключ или IP
- инстансов gateway несколько, поэтому счётчик держат в общем хранилище, обычно в Redis
Circuit breaker на маршруте - сервис за gateway начал падать, и gateway перестаёт слать ему запросы, а через паузу пробует снова.
- клиент не висит до таймаута, а сразу получает
503или запасной ответ: кэш, заглушку сервис временно недоступен - упавший сервис не добивают потоком запросов, пока он поднимается
- breaker обычно настраивают на маршрут вместе с timeout и retry
Breaker на gateway защищает только вход. Вызовам между сервисами нужны свои breaker: в библиотеке или в service mesh.
Остальное:
- TLS termination - gateway расшифровывает внешний TLS, внутрь идёт HTTP или mTLS внутри mesh
- Сборка ответа - вызывает несколько сервисов и склеивает ответ (API Composition)
- Кэш ответов - отдаёт повторный GET из кэша, не дёргая сервис
- WAF и проверка схемы - отсекает типовые атаки и запросы, которые не подходят под контракт (см. Политики на gateway)
- Логи, метрики, трейсы - весь внешний трафик проходит через одну точку, здесь удобно начинать трейс
Готовые API Gateway¶
Gateway почти никогда не пишут с нуля. Выбирают между готовым продуктом, фреймворком и облаком.
| Вариант | Что пишешь сам | Примеры | Когда брать |
|---|---|---|---|
| Готовый продукт | Конфиг и при необходимости плагин | Kong, Apache APISIX, Tyk, KrakenD, Envoy Gateway | По умолчанию: стандартный роутинг, auth, лимиты |
| Фреймворк | Сервис: маршруты и фильтры в коде | Spring Cloud Gateway, YARP и Ocelot в .NET | Нестандартная логика на входе, команда на Java или .NET |
| Облачный (managed) | Только настройку в консоли или Terraform | AWS API Gateway, Azure API Management, Google Apigee | Система живёт в одном облаке |
| С нуля | Весь прокси | Почти никогда |
Почти все готовые gateway построены на нескольких прокси-движках:
NGINX --- OpenResty (NGINX + Lua) ---+--- Kong
+--- Apache APISIX
Envoy ---+--- Envoy Gateway
+--- Istio ingress gateway
+--- Contour
+--- Emissary-ingress (бывший Ambassador)
+--- Gloo Gateway
Go ------+--- Tyk
+--- KrakenD
+--- Traefik
JVM -----+--- Spring Cloud Gateway
+--- Gravitee
| Прокси, из которых собирают gateway | Что это | Когда брать |
|---|---|---|
| NGINX | Reverse proxy на C, gateway собирают из конфига | Простой вход: TLS, маршруты, rate limit |
| HAProxy | Балансировщик L4 и L7 на C | Высокая нагрузка, балансировка без API-логики |
| Envoy | L7-прокси на C++, конфиг меняется на лету через API | Kubernetes, основа для gateway и mesh |
| Traefik | Reverse proxy на Go, маршруты берёт из меток Docker и Kubernetes | Docker Compose, небольшой Kubernetes |
| Готовые API gateway | Что это | Когда брать |
|---|---|---|
| Kong | NGINX и Lua, плагины, конфиг в Postgres или декларативном файле | Нужны готовые плагины: auth, лимиты, логи |
| Apache APISIX | NGINX и Lua, конфиг в etcd | Маршруты и плагины меняются на лету |
| Tyk | Go, open source gateway и платный дашборд | Gateway вместе с API management |
| KrakenD | Go, stateless, весь конфиг в одном файле | Сборка ответа из нескольких сервисов без кода |
| Gravitee | Java, gateway и API management с порталом | Нужен портал для внешних разработчиков |
| Фреймворки для своего gateway | Что это | Когда брать |
|---|---|---|
| Spring Cloud Gateway | Spring WebFlux и Netty. С версии 4.1 есть вариант на Spring MVC | Java и Spring стек |
| Netflix Zuul | Первый массовый gateway из Netflix OSS | Легаси. В Spring Cloud его сменил Spring Cloud Gateway |
| YARP | Библиотека reverse proxy от Microsoft | .NET-стек |
| Ocelot | API gateway на ASP.NET Core | Небольшой gateway в .NET |
| Облачные | Что это | Когда брать |
|---|---|---|
| AWS API Gateway | REST, HTTP и WebSocket API, интеграция с Lambda | Бэкенд в AWS, serverless |
| Azure API Management | Gateway и API management | Бэкенд в Azure |
| Google Apigee, Google Cloud API Gateway | Apigee - API management для enterprise, API Gateway - лёгкий вход | Бэкенд в GCP |
| Yandex Cloud API Gateway | Маршруты описывают спецификацией OpenAPI с расширениями | Бэкенд в Yandex Cloud |
Грабли¶
- God gateway. В gateway заползает бизнес-логика: «если заказ дороже X - добавь скидку». Через год это монолит, через который ходит всё, и менять его страшно. Gateway держит инфраструктурные задачи (auth, routing, rate limit), бизнес-правила остаются в сервисах (см. God gateway).
- Single point of failure. Упал gateway - упало всё. Нужны несколько инстансов, health checks и отдельный деплой.
- Узкое место по релизам. Каждый новый маршрут требует правки общего gateway, и он становится очередью между командами. Помогает BFF: у каждого клиента свой вход, которым владеет его команда.
С чем путают API Gateway¶
| Паттерн | Что делает | Чем отличается от gateway |
|---|---|---|
| Reverse proxy | Принимает запросы вместо серверов и пересылает дальше | Не понимает API. Gateway - reverse proxy, который знает клиентов, токены, лимиты |
| Load balancer | Распределяет запросы по инстансам одного сервиса, L4 или L7 | Не роутит по API. Обычно стоит перед gateway и балансирует его инстансы |
| Ingress controller | Пускает HTTP-трафик в кластер Kubernetes по хосту и пути | Политики на клиента (auth, лимиты) только через расширения |
| Service mesh | Ведёт трафик между сервисами через прокси рядом с каждым | Трафик east-west (сервис -> сервис), а gateway - north-south (клиент -> система) |
| API management | Портал для разработчиков, API-ключи, тарифы, аналитика | Платформа вокруг gateway. Gateway - её часть, через которую идёт трафик |
| ESB | Шина SOA: трансформации, оркестрация, бизнес-роутинг | Умная труба. Gateway с бизнес-логикой и есть ESB на входе |
| Facade (GoF) | Простой интерфейс поверх сложной подсистемы в одном процессе | Та же идея, но gateway сетевой и для внешних клиентов |
| BFF | Вход под один тип клиента | Свой вход на каждый тип клиента вместо общего |
| API Composition | Собирает ответ из нескольких сервисов | Отдельный паттерн. Gateway умеет его, но composer бывает отдельным сервисом |
В других срезах¶
- Безопасность - Политики на gateway: WAF, проверка схемы, где валидировать токен
- Устойчивость - Rate Limiting и Circuit Breaker: как устроены механизмы, которые gateway включает на маршруте
- Аутентификация - Проверка JWT на сервере
- Анти-паттерны - God gateway: бизнес-логика на входе
- Топология - Topology Architecture: вход в систему при любой нарезке на сервисы