Настройка API Gateway (Kong) для веб-приложения
Kong — самый распространённый open-source API Gateway, построенный на nginx/OpenResty. Обрабатывает аутентификацию, rate limiting, трансформации запросов, мониторинг и роутинг для микросервисных архитектур.
Архитектура Kong
Kong работает как прокси: все запросы от клиентов проходят через Kong, который применяет плагины и перенаправляет трафик на upstream-сервисы. Конфигурация хранится в PostgreSQL или в режиме DB-less через YAML.
Client → Kong Gateway → Plugins (auth, rate limit, log) → Upstream Service
Установка Kong с PostgreSQL
# Docker Compose
version: '3.8'
services:
kong-db:
image: postgres:15
environment:
POSTGRES_DB: kong
POSTGRES_USER: kong
POSTGRES_PASSWORD: kong_password
kong-migration:
image: kong:3.5
command: kong migrations bootstrap
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-db
KONG_PG_USER: kong
KONG_PG_PASSWORD: kong_password
depends_on: [kong-db]
kong:
image: kong:3.5
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-db
KONG_PG_USER: kong
KONG_PG_PASSWORD: kong_password
KONG_PROXY_ACCESS_LOG: /dev/stdout
KONG_ADMIN_ACCESS_LOG: /dev/stdout
KONG_PROXY_ERROR_LOG: /dev/stderr
KONG_ADMIN_ERROR_LOG: /dev/stderr
KONG_ADMIN_LISTEN: 0.0.0.0:8001
KONG_PROXY_LISTEN: 0.0.0.0:8000, 0.0.0.0:8443 ssl
ports:
- "8000:8000" # HTTP proxy
- "8443:8443" # HTTPS proxy
- "8001:8001" # Admin API (закрыть от внешнего доступа!)
depends_on: [kong-migration]
Настройка сервисов и роутов
# Создать upstream-сервис
curl -X POST http://localhost:8001/services \
-d name=users-api \
-d url=http://users-service:3000
# Создать роут
curl -X POST http://localhost:8001/services/users-api/routes \
-d 'paths[]=/api/v1/users' \
-d 'methods[]=GET' \
-d 'methods[]=POST' \
-d strip_path=false
# Проверка
curl http://localhost:8000/api/v1/users
Декларативная конфигурация (DB-less режим)
# kong.yml
_format_version: "3.0"
services:
- name: users-api
url: http://users-service:3000
routes:
- name: users-route
paths: [/api/v1/users]
strip_path: false
plugins:
- name: rate-limiting
config:
minute: 60
policy: local
- name: jwt
config:
secret_is_base64: false
- name: products-api
url: http://products-service:3001
routes:
- name: products-route
paths: [/api/v1/products]
plugins:
- name: key-auth
Ключевые плагины
JWT-аутентификация
# Включить JWT плагин на сервисе
curl -X POST http://localhost:8001/services/users-api/plugins \
-d name=jwt
# Создать consumer
curl -X POST http://localhost:8001/consumers \
-d username=mobile-app
# Создать JWT credentials
curl -X POST http://localhost:8001/consumers/mobile-app/jwt \
-d algorithm=RS256 \
-d rsa_public_key="$(cat public.pem)"
Rate Limiting с Redis
curl -X POST http://localhost:8001/plugins \
-d name=rate-limiting \
-d config.minute=100 \
-d config.hour=5000 \
-d config.policy=redis \
-d config.redis_host=redis \
-d config.redis_port=6379 \
-d config.limit_by=consumer # или ip, service, route
CORS
curl -X POST http://localhost:8001/services/users-api/plugins \
-d name=cors \
-d 'config.origins[]=https://app.company.com' \
-d 'config.methods[]=GET' \
-d 'config.methods[]=POST' \
-d 'config.headers[]=Authorization' \
-d 'config.headers[]=Content-Type' \
-d config.credentials=true
Request Transformer
curl -X POST http://localhost:8001/services/users-api/plugins \
-d name=request-transformer \
-d 'config.add.headers[]=X-Internal-Key:secret123' \
-d 'config.remove.headers[]=X-Forwarded-For' \
-d 'config.add.querystring[]=version:2'
Канареечные деплои через Kong
# Создать два upstream
curl -X POST http://localhost:8001/upstreams -d name=api-upstream
# Добавить targets с весами
curl -X POST http://localhost:8001/upstreams/api-upstream/targets \
-d target=api-v1:3000 -d weight=90
curl -X POST http://localhost:8001/upstreams/api-upstream/targets \
-d target=api-v2:3000 -d weight=10
Observability
# Prometheus плагин
curl -X POST http://localhost:8001/plugins \
-d name=prometheus
# Grafana dashboard для Kong доступен по ID 7424 на grafana.com
Метрики в Prometheus:
kong_http_requests_total{service="users-api",route="users-route",status="200"}
kong_request_latency_ms{service="users-api",quantile="0.99"}
Управление через Konga (web UI)
docker run -d -p 1337:1337 \
-e NODE_ENV=production \
-e DB_ADAPTER=postgres \
-e DB_HOST=kong-db \
pantsel/konga
Срок выполнения
Базовая установка Kong с JWT, rate limiting и роутингом — 2–3 рабочих дня. Полная настройка с observability, канареечными деплоями и HA-конфигурацией — 5–7 дней.







