Перейти к основному содержимому

API Gateway

Разработчику Инженеру Архитектору

Когда у продукта один backend, клиенты обращаются к нему напрямую. Когда сервисов десять, клиенту неудобно знать адрес каждого. API Gateway — единая "дверь" для всех внешних запросов. Он принимает трафик, завершает TLS, проверяет токены, ограничивает частоту запросов и направляет вызовы к нужному микросервису.

Эта статья объясняет, зачем нужен gateway, чем он отличается от балансировщика нагрузки, какие решения выбрать и как настроить безопасность на периметре.

API Gateway — программный компонент на границе системы. Он понимает HTTP: path, headers, метод, тело запроса. На основе этих данных применяет политики и маршрутизирует трафик.


Gateway и балансировщик нагрузки

Load balancer (балансировщик нагрузки) распределяет трафик между копиями одного сервиса. Он работает на уровне L4 (TCP) или простого L7 (один hostname → пул серверов). Не разбирает /api/v1/orders и /api/v1/users как разные политики.

API Gateway работает на уровне L7 HTTP и знает структуру API:

  • Маршрутизация по path и host
  • Версионирование (/v1/, /v2/)
  • Аутентификация и авторизация
  • Rate limiting per client
  • Трансформация запросов и ответов
АспектБалансировщикAPI Gateway
УровеньL4 или простой L7Полный L7 HTTP
МаршрутизацияНа один сервисНа много сервисов по path
AuthОбычно нетJWT, API key, OAuth
Rate limitБазовый или нетPer consumer, per route
Типичный примерAWS NLB, HAProxyKong, nginx, AWS API Gateway

На практике слои складываются: cloud ALB балансирует трафик на несколько инстансов Kong, а Kong маршрутизирует на микросервисы. Подробнее — 8.05/111.


Когда нужен API Gateway

СитуацияРешение
Один monolith, один доменДостаточно reverse proxy (nginx)
3+ микросервиса с внешним APIGateway оправдан
Разные команды, разные релизыGateway скрывает внутреннюю топологию
Партнёрские API с billingGateway для ключей и квот
Canary / blue-green на уровне APIGateway переключает процент трафика

Gateway не обязателен на старте. Добавляйте, когда появляется боль от множества endpoint, дублирования TLS и auth в каждом сервисе.


Задачи gateway на периметре

ФункцияЧто делаетРезультат для команды
TLS terminationПринимает HTTPS, внутри — HTTP или mTLSСертификаты в одном месте, автообновление
Routing/api/orders → orders-service:8080Клиент видит один домен
AuthenticationПроверка JWT, API key, OAuth introspectionСервисы доверяют gateway или получают identity headers
Rate limitingN запросов в секунду per IP / per keyЗащита от abuse и контроль cost
ObservabilityAccess logs, trace id, metricsЕдиная картина трафика
Protocol bridgeREST наружу, gRPC внутриКлиенты не знают про внутренние протоколы
Request transformationДобавить header, изменить pathСовместимость версий API
CachingКеш GET-ответовСнижение нагрузки на backend

Проектирование контрактов API — 8.05/122.


Архитектурные паттерны

Single gateway

Один gateway на весь кластер. Просто в эксплуатации, но может стать bottleneck и single point of failure.

Gateway per domain

Отдельный gateway для публичного API и отдельный для internal admin. Admin gateway за VPN или IP allowlist.

Two-tier gateway

Cloud managed ALB → Kong/Ingress в K8s → сервисы. Первый уровень — DDoS и TLS, второй — API-политики.


Варианты реализации

РешениеСильные стороныКогда выбирать
nginx / OpenRestyБыстрый, знакомый, lua-скриптыPet-проекты, mid-size, команда знает nginx — конфиги
Traefik / CaddyAuto TLS (Let's Encrypt), K8s IngressK8s, малые команды, нужен auto-cert
Kong / APISIXПлагины, consumers, key-auth, rate limit из коробкиМного API, нужны enterprise-фичи
Envoy + Gateway APICloud-native, extensible, Istio edgeService mesh, K8s Gateway API
Cloud ALB / API GatewayManaged, масштаб, интеграция с облакомAWS, Yandex Cloud, VK Cloud — минимум ops
GraphQL federation routerЕдиная GraphQL-схема из subgraphsGraphQL-first архитектура — 8.05/1203

nginx / OpenResty

Классический reverse proxy. Rate limit, SSL, proxy_pass. OpenResty добавляет Lua для кастомной логики (JWT validation, dynamic routing).

Подходит, когда:

  • Команда уже использует nginx
  • Нужен минимальный ops overhead
  • Политики простые (path routing + TLS + basic rate limit)

Kong

API Gateway на базе OpenResty с богатой экосистемой плагинов:

  • jwt — валидация JWT
  • rate-limiting — квоты per consumer
  • key-auth — API keys
  • request-transformer — модификация headers
  • prometheus — метрики

Kong хранит конфигурацию в PostgreSQL или DB-less mode (declarative YAML).

Traefik

Нативная интеграция с Docker и Kubernetes. Автоматически обнаруживает сервисы по labels. Встроенный Let's Encrypt.

Cloud managed

AWS API Gateway, Yandex API Gateway, Azure API Management — полностью управляемые. Платите за запросы, но не администрируете инстансы. Хороши для serverless (Lambda + API Gateway).


Минимальный nginx

Базовый пример с rate limit и проксированием:

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

upstream orders_upstream {
server orders-1.internal:8080;
server orders-2.internal:8080;
}

server {
listen 443 ssl http2;
server_name api.example.com;

ssl_certificate /etc/ssl/api.example.com.crt;
ssl_certificate_key /etc/ssl/api.example.com.key;

location /api/v1/orders/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://orders_upstream;
proxy_set_header Host $host;
proxy_set_header X-Request-Id $request_id;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

location /api/v1/catalog/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://catalog_upstream;
proxy_set_header X-Request-Id $request_id;
}
}

limit_req_zone — 10 запросов в секунду с IP, burst до 20. $request_id — уникальный ID для трассировки в логах всех сервисов.

WebSocket требует отдельных заголовков Upgrade и Connectionпрактикум REST.


Kong — пример declarative config

_format_version: "3.0"
services:
- name: orders-service
url: http://orders.internal:8080
routes:
- name: orders-route
paths:
- /api/v1/orders
strip_path: false
plugins:
- name: rate-limiting
config:
minute: 100
policy: local
- name: jwt
config:
claims_to_verify:
- exp

consumers:
- username: partner-acme
keyauth_credentials:
- key: "partner-secret-key-xxx"

Файл загружается при старте Kong (kong config db_import). Версионируйте в Git — тот же подход, что в GitOps.


Маршрутизация и версионирование

СтратегияПримерПлюсы
Path prefix/v1/orders, /v2/ordersПросто, видно в URL
HeaderAccept-Version: 2Чистый URL
Hostv1.api.example.comИзоляция по домену
Canary5% трафика на v2Безопасный rollout

При canary gateway сравнивает hash client IP или header и направляет фиксированный процент на новую версию.


Аутентификация на gateway

Три распространённых подхода:

Terminate auth на gateway

Gateway проверяет JWT и передаёт в backend заголовки X-User-Id, X-Roles. Backend доверяет gateway (только internal network).

  • Плюс: единая точка проверки токенов
  • Минус: backend должен доверять заголовкам; компрометация gateway = полный доступ

Pass-through token

Gateway проверяет JWT (exp, signature) и передаёт оригинальный Authorization header в backend. Backend делает fine-grained AuthZ.

  • Плюс: defense in depth
  • Минус: дублирование валидации

API keys для партнёров

Gateway проверяет X-Api-Key, маппит на consumer с квотами. Подходит для B2B интеграций.

Важно: никогда не доверяйте X-Forwarded-User или X-User-Email без проверки JWT на gateway. Атакующий может подставить заголовок, если gateway его не перезаписывает.

Подробнее — OIDC и OAuth, 12 советов по безопасности API.


Rate limiting

Rate limit ограничивает число запросов за период. Защищает от:

  • Brute force на login
  • Scraping данных
  • DDoS на уровне приложения
  • Неконтролируемого роста cloud bill
АлгоритмОписание
Fixed windowN запросов в минуту, сброс в начале минуты
Sliding windowПлавнее, без burst на границе окна
Token bucketBurst разрешён, средняя скорость ограничена

Настраивайте разные лимиты:

  • Анонимные IP — строже
  • Авторизованные пользователи — мягче
  • Partner API keys — по контракту (1000 req/min)

При превышении возвращайте 429 Too Many Requests с заголовком Retry-After.


Безопасность на gateway

TLS

  • TLS 1.2+ минимум, предпочтительно 1.3
  • HSTS — принудительный HTTPS
  • Корректные cipher suites — SSL/TLS
  • Автообновление сертификатов (Let's Encrypt, cert-manager в K8s)

WAF

WAF (Web Application Firewall) фильтрует вредоносные запросы: SQL injection, XSS, известные CVE. Варианты:

  • ModSecurity с OWASP Core Rule Set
  • Cloud WAF (AWS WAF, Yandex Smart Web Security)
  • Встроенный WAF в Kong Enterprise

Подробнее — 8.07/113.

Ограничение размера тела

client_max_body_size 1m;

Защита от DoS большими JSON или file upload. Настраивайте per route (upload endpoint — больше, API — меньше).

mTLS внутри периметра

Клиент → gateway (публичный TLS). Gateway → backend (mTLS — mutual TLS, оба предъявляют сертификат). Подробнее — интеграции mTLS.

IP allowlist

Admin API и internal endpoint — только с офисных IP или VPN. На gateway, не на каждом сервисе.


API Gateway и Service Mesh

Два дополняющих слоя в зрелой микросервисной архитектуре:

СлойНаправление трафикаПримеры
API Gateway (north-south)Клиент → кластерKong, Ingress, cloud ALB
Service Mesh (east-west)service A → service BIstio, Linkerd — 8.04/218

Gateway защищает внешний периметр. Mesh защищает внутренний трафик между сервисами. В зрелых MSA используют оба слоя.


Observability

Gateway — идеальное место для единых логов и трассировки.

СигналЧто логироватьЗачем
Access logmethod, path, status, latency, client IPАудит, SLA
Trace idX-Request-Id или W3C traceparentСквозная трассировка
Auth eventsconsumer, JWT sub, deniedSecurity monitoring
Rate limit hitsIP, route, 429 countTuning лимитов

Интеграция с Prometheus (Kong plugin, nginx exporter), Grafana dashboards, алерты на рост 5xx и 429.


Развёртывание в Kubernetes

Типичная схема:

  • Ingress (nginx-ingress, Traefik) — L7 маршрутизация в K8s
  • Gateway API — новый стандарт, замена Ingress (более выразительный)
  • cert-manager — автоматические TLS-сертификаты

Для production: минимум 2 реплики gateway, PodDisruptionBudget, health checks.


Антипаттерны

АнтипаттернПочему плохоЧто делать
Smart gateway, dumb servicesВся бизнес-логика в Kong pluginsЛогика в сервисах, gateway — инфраструктура
Double gatewayДва gateway подряд без согласованных timeoutsОдин слой политик или явные timeout budget
Public admin APIAdmin на том же host без ограниченийОтдельный host + IP allowlist + mTLS
God gateway config5000 строк nginx без модулейРазбить по файлам, GitOps
No health checksGateway шлёт трафик на мёртвый backendActive health checks, circuit breaker

Миграция к gateway

Пошаговый план для существующего monolith:

ФазаДействие
1Поставить nginx перед monolith, TLS termination
2Вынести один endpoint в отдельный сервис, path routing
3Добавить JWT validation на gateway
4Rate limit и access logs
5Постепенно выносить domain в микросервисы

Не пытайтесь внедрить Kong + Istio + WAF за один спринт. Начните с reverse proxy и добавляйте политики по мере роста.


Стоимость и производительность

ФакторВлияние
Managed gatewayПлата за миллион запросов
Self-hosted KongИнстансы + PostgreSQL + ops
TLS terminationCPU на handshake (сессии, TLS 1.3 resumption)
JWT validationCPU на криптографию (кешируйте JWKS)
WAFLatency + false positives

Gateway добавляет 1–5 ms latency. Для большинства API это приемлемо. Профилируйте при >10k RPS.


GraphQL и gRPC на gateway

GraphQL

GraphQL federation router (Apollo Router, Hive) — отдельный тип gateway. Принимает один GraphQL endpoint, маршрутизирует к subgraphs.

Задача gatewayРеализация
AuthJWT в header, передача в subgraphs
Rate limitПо operation name, depth limit
Query costОграничение сложности запроса
CachingPersisted queries

Подробнее — 8.05/1203.

gRPC transcoding

Внешние клиенты говорят REST/JSON, внутри — gRPC. Envoy и cloud gateways поддерживают gRPC-JSON transcoding по proto annotations.

Клиент: POST /v1/orders {"id": 1}
Gateway: transcoding → gRPC GetOrder(id=1)
orders-service: gRPC response → JSON

API Management для партнёров

B2B API требует отдельного lifecycle:

ФункцияОписание
Developer portalДокументация, регистрация, получение key
API keys / OAuth clientPer-partner credentials
Quotas10 000 req/day per partner
AnalyticsUsage billing, top consumers
VersioningDeprecation policy, sunset headers

Kong Consumer + key-auth или cloud API Management (AWS, Azure) закрывают этот сценарий.


Disaster recovery gateway

Gateway — single point of failure, если один инстанс.

ПрактикаОписание
Минимум 2 репликиЗа LB, в разных AZ
Declarative config в GitБыстрое восстановление
Health check upstreamНе слать на мёртвый backend
Circuit breakerОтсечь failing service, fallback 503
Config backupDB Kong / etcd snapshot

RTO gateway: при GitOps config — поднять новый инстанс за минуты.


Пример Traefik в Docker Compose

services:
traefik:
image: traefik:v3
command:
- "--providers.docker=true"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
ports:
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock

orders-api:
labels:
- "traefik.http.routers.orders.rule=PathPrefix(`/api/v1/orders`)"
- "traefik.http.routers.orders.tls.certresolver=letsencrypt"

Labels на контейнерах — маршрутизация без ручного конфига. Подходит для pet-проектов и staging.


Чек-лист API Gateway

  • TLS 1.2+, HSTS, автообновление сертификатов
  • JWT / API key validation на gateway
  • Rate limiting per IP и per consumer
  • X-Request-Id / trace propagation
  • Body size limits
  • Health checks на upstream
  • Access logs в централизованное хранилище
  • Admin API за VPN / IP allowlist
  • WAF или ModSecurity для публичного API
  • Конфигурация в Git (GitOps)

Runbook — gateway возвращает 502

ШагДействиеКритерий
1Проверить health upstreamcurl напрямую к service
2Логи gateway — timeout или connection refusedRoot cause в логах
3K8s — Pod Ready, endpoints не пустkubectl get ep
4Circuit breaker open — дождаться half-openGrafana panel
5Rollback последнего config deployGit revert
6Scale upstream replicasHPA или manual

Если 502 только на одном route — проблема в конкретном service, не в gateway global.


Runbook — DDoS на публичный API

ШагДействие
1Включить aggressive rate limit per IP
2WAF challenge или geo block при необходимости
3Уведомить провайдера CDN/DDoS scrubbing
4Preserve access logs для forensics
5Post-incident — tune baseline limits

Заранее согласуйте с провайдером DDoS protection tier — у Yandex Cloud и Selectel есть опции.


Compliance — API Gateway и 152-ФЗ

ТребованиеРеализация на gatewayАртефакт
TLS на периметреTLS 1.2+, HSTSConfig export
Учёт доступаAccess log с user idSIEM retention
Минимизация exposureInternal routes не в public gatewayRoute audit
ПДн в URLBlock query log PII, redactLog pipeline config
Rate limit abusePer consumer quotasPolicy doc

Gateway — первая точка для data minimization в логах. Не логируйте Authorization header целиком.


Расширенный пример — marketplace с партнёрским API

B2B marketplace, 200 партнёров, Kong на MK8s Yandex Cloud.

КомпонентРешение
EdgeYandex ALB → Kong 3 replicas
AuthOAuth2 client credentials per partner
Rate limit10k req/day bronze, 100k gold
AnalyticsPrometheus + Grafana per consumer
DocsDeveloper portal OpenAPI 3
WAFModSecurity OWASP CRS

Onboarding партнёра — self-service portal создаёт Consumer + key, webhook на CRM. Revoke — disable Consumer одной кнопкой.


Сравнение API Gateway для Kubernetes

GatewayМодель configJWTRate limitGitOpsЛицензия
KongDB или declarativePluginPluginДаOSS + Enterprise
TraefikCRD / fileMiddlewareMiddlewareДаOSS
NGINX IngressIngress YAMLExternalLimit reqДаOSS
Envoy GatewayGateway APIext_authzLocalДаOSS
Yandex ALB + IngressCloud + K8sJWT optionalCloudPartialCloud

Старт — NGINX Ingress или Traefik. Enterprise API Management — Kong Enterprise или cloud API Management.


Сравнение cloud load balancer в РФ

ПродуктПровайдерL7 routingWAFИнтеграция K8s
Application LBYandex CloudДаPartialIngress controller
Cloud LBVK CloudДаОпцияДа
Selectel LBSelectelL4/L7НетManual
Self-hosted HAProxyЛюбойДаExternalДа

Для гостech часто требуют on-prem HAProxy перед K8s — cloud LB только на DMZ.


Региональная специфика — ГОСТ и TLS

СценарийПрактика
ГОСТ TLS к госсистемамTermination на отдельном proxy
Let's EncryptРаботает на публичных доменах РФ
Internal mTLSКорпоративный CA, не публичный LE
Certificate storageCert-manager + Lockbox

Смешивание ГОСТ edge и RSA internal — типичная схема для интеграции с ЕСИА и отраслевыми шлюзами.


Расширенный пример — canary через gateway weights

# Kong declarative fragment
services:
- name: orders-v1
url: http://orders-v1:8080
- name: orders-v2
url: http://orders-v2:8080
routes:
- name: orders-canary
paths: ["/api/v1/orders"]
plugins:
- name: canary
config:
percentage: 10
upstream_host: orders-v2

Альтернатива в mesh — Istio VirtualService. Gateway canary проще, когда mesh ещё нет.


Runbook — JWT validation fail на gateway

ШагДействие
1Проверить clock skew
2JWKS URL доступен из gateway pod
3aud claim совпадает с API identifier
4iss в allowlist
5Token expired — client refresh flow

Кешируйте JWKS 15 min, но поддерживайте key rotation IdP.


Расширенный пример — internal API без public route

# Ingress — только corporate VPN CIDR
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: internal-api
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8,172.16.0.0/12"
spec:
rules:
- host: api.internal.example.ru
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend
port:
number: 8080

Public gateway и internal ingress — разные entry points, разные policy.


Compliance — логирование API для 152-ФЗ

Поле access logХранитьМаскировать
timestampДа
client_ipДаPartial /64
user_idДа
pathДа
AuthorizationНетDrop header
request bodyНет

Retention access log — согласовать с DPO, типично 6–12 месяцев.


Сравнение rate limiting algorithms

AlgorithmBurstFairnessKongNGINX
Fixed windowSharp edgeLowДаlimit_req
Sliding windowSmoothMediumДаCustom
Token bucketConfigurableHighДаlimit_req

API с mobile clients — token bucket с reasonable burst.


Связанные материалы


Содержание