Реалізація маршрутизації запитів через API Gateway

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація маршрутизації запитів через API Gateway
Середня
~2-3 робочих дні
Часті питання

Наші компетенції:

Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація маршрутизації запитів через 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 робочих дня.