Реалізація маршрутизації запитів через API Gateway
Маршрутизація (routing) — ключова функція API Gateway: визначити, який backend-сервіс повинен обробити конкретний запит. Складна маршрутизація дозволяє керувати версіями API, канареєвими розгортаннями та tenant-based routing без змін клієнтського коду.
Типи маршрутизації
Path-based routing — за шляхом URL:
-
/api/v1/users→ users-service -
/api/v1/orders→ orders-service -
/api/v2/users→ users-service-v2
Header-based routing — за HTTP-заголовками:
-
X-API-Version: 2→ нова версія -
X-Tenant-ID: enterprise→ виділений кластер
Query parameter routing:
-
?version=beta→ beta backend
Method-based routing:
-
GET /resources→ read-service -
POST /resources→ write-service
Реалізація в Kong
# Версіонування через path prefix
curl -X POST http://localhost:8001/services/users-v1/routes \
-d "paths[]=/api/v1/users" \
-d "strip_path=false" \
-d "name=users-v1-route"
curl -X POST http://localhost:8001/services/users-v2/routes \
-d "paths[]=/api/v2/users" \
-d "strip_path=false" \
-d "name=users-v2-route"
# Header-based routing
curl -X POST http://localhost:8001/services/users-v2/routes \
-d "paths[]=/api/users" \
-d 'headers[X-API-Version][]=2' \
-d "name=users-v2-header-route"
Реалізація в Traefik
# dynamic/routing.yml
http:
routers:
# Path-based
users-v1:
rule: "PathPrefix(`/api/v1/users`)"
service: users-v1-service
priority: 10
users-v2:
rule: "PathPrefix(`/api/v2/users`)"
service: users-v2-service
priority: 10
# Header-based
users-enterprise:
rule: "PathPrefix(`/api/users`) && Headers(`X-Tenant-Tier`, `enterprise`)"
service: users-enterprise-service
priority: 20 # вищий priority = перевіряється першим
# Регулярне вираження
users-by-region:
rule: "PathRegexp(`^/api/v1/(eu|us|asia)/users`)"
service: regional-users-service
middlewares: [extract-region]
Реалізація в NGINX (без спеціалізованого gateway)
# /etc/nginx/conf.d/api-routing.conf
map $http_x_api_version $backend_pool {
"2" "users_v2_backend";
"beta" "users_beta_backend";
default "users_v1_backend";
}
upstream users_v1_backend { server users-v1:3000; }
upstream users_v2_backend { server users-v2:3000; }
upstream users_beta_backend { server users-beta:3000; }
server {
listen 80;
location ~ ^/api/v([0-9]+)/(.+) {
set $version $1;
set $path $2;
proxy_pass http://users_v${version}_backend/$path$is_args$args;
proxy_set_header X-API-Version $version;
}
# Tenant routing
location /api/users {
if ($http_x_tenant_tier = "enterprise") {
proxy_pass http://enterprise-cluster;
}
proxy_pass http://users_v1_backend;
}
}
Канареєва маршрутизація
Поступовий rollout нової версії за процентами трафіку:
# Traefik weighted
http:
services:
users-canary:
weighted:
services:
- name: users-stable
weight: 95
- name: users-canary
weight: 5
-- Kong: випадкова маршрутизація через плагін
-- 10% трафіку → новий сервіс
local random = math.random(100)
if random <= 10 then
kong.service.set_upstream("users-v2")
else
kong.service.set_upstream("users-v1")
end
Sticky routing (tenant affinity)
Запити конкретного тенанта завжди попадають на один шард:
-- Kong Lua plugin
local tenant_id = kong.request.get_header("X-Tenant-ID")
local shard = tonumber(tenant_id) % 4 -- 4 шарди
local upstreams = {
"shard-0.users-service:3000",
"shard-1.users-service:3000",
"shard-2.users-service:3000",
"shard-3.users-service:3000"
}
kong.service.set_target(upstreams[shard + 1], 3000)
A/B routing за атрибутами користувача
// KrakenD: routing за значенням із JWT
// У конфігурації endpoint використовуємо JWT claims для вибору backend
// Або через middleware:
// Якщо user.tier == 'premium' → premium-backend
// Інакше → standard-backend
Моніторинг маршрутів
Важливо відслідковувати розподіл трафіку між маршрутами:
# Prometheus запит: відсоток трафіку за версіями
rate(kong_http_requests_total{route=~"users-v.*"}[5m])
/
sum(rate(kong_http_requests_total{service="users"}[5m]))
Алерт при аномальному розподілі (канарейка отримала занадто багато трафіку):
- alert: CanaryTrafficAnomaly
expr: |
rate(http_requests_total{version="v2"}[5m]) /
rate(http_requests_total[5m]) > 0.15
for: 2m
annotations:
summary: "Canary receiving more than 15% of traffic"
Графік
Налаштування багаторівневої маршрутизації (path + header + tenant) на обраному API Gateway — 1–2 робочих дня.







