Реалізація API Gateway Pattern для мікросервісів
API Gateway — єдина точка входу для всіх клієнтів системи. Замість того щоб фронтенд або мобільний додаток звертались безпосередньо до десятків мікросервісів, вони взаємодіють з одним шлюзом, який маршрутизує запити, агрегує дані, застосовує аутентифікацію та rate limiting.
Функції API Gateway
-
Маршрутизація —
/api/orders→ Order Service,/api/users→ User Service - Аутентифікація та авторизація — JWT/OAuth2 перевіряється один раз у шлюзі
- Rate Limiting — захист від зловживань
- SSL Termination — TLS завершується на шлюзі, мікросервіси спілкуються через HTTP всередині кластера
- Request/Response трансформація — зміна форматів, додавання заголовків
- Агрегація запитів — один запит клієнта → кілька запитів до сервісів
- Circuit Breaker — захист від каскадних відмов
- Логування та трейсинг — єдина точка збору access logs
Варіанти реалізації
| Інструмент | Тип | Особливості |
|---|---|---|
| Kong | Self-hosted / Cloud | Плагіни на Lua/Go, Kubernetes Ingress |
| Traefik | Self-hosted | Автодискавері в Docker/K8s |
| AWS API Gateway | Managed | Інтеграція з Lambda, IAM |
| NGINX + Lua | Self-hosted | Максимальний контроль |
| Envoy | Proxy | gRPC, складні сценарії |
| Express Gateway | Node.js | Прості випадки |
Конфігурація Kong
Kong — найпопулярніший self-hosted шлюз:
# kong.yaml (декларативна конфігурація)
_format_version: "3.0"
services:
- name: order-service
url: http://order-service:3000
routes:
- name: orders-route
paths: ["/api/orders"]
methods: ["GET", "POST", "PUT", "DELETE"]
- name: user-service
url: http://user-service:3001
routes:
- name: users-route
paths: ["/api/users"]
methods: ["GET", "PUT"]
plugins:
- name: jwt
config:
claims_to_verify: ["exp"]
- name: rate-limiting
config:
minute: 100
hour: 5000
policy: local
- name: request-transformer
config:
add:
headers: ["X-Service-Version:1.0"]
Аутентифікація на рівні шлюзу
JWT перевіряється у шлюзі, мікросервіси отримують вже перевірені заголовки з даними користувача:
// Власний middleware на Express Gateway
async function jwtMiddleware(req, res, next) {
const token = req.headers.authorization?.replace('Bearer ', '');
if (!token) return res.status(401).json({ error: 'No token' });
try {
const payload = jwt.verify(token, process.env.JWT_SECRET);
// Передаємо дані користувача в заголовках
req.headers['X-User-Id'] = payload.sub;
req.headers['X-User-Role'] = payload.role;
req.headers['X-User-Email'] = payload.email;
next();
} catch {
res.status(401).json({ error: 'Invalid token' });
}
}
Агрегація запитів (BFF-паттерн у шлюзі)
Мобільний клієнт за один запит отримує дані з кількох сервісів:
// Gateway агрегує дані з кількох сервісів
app.get('/api/dashboard/:userId', jwtMiddleware, async (req, res) => {
const { userId } = req.params;
const [user, orders, notifications] = await Promise.allSettled([
userService.get(`/users/${userId}`),
orderService.get(`/orders?customerId=${userId}&limit=5`),
notificationService.get(`/notifications/${userId}/unread`)
]);
res.json({
user: user.status === 'fulfilled' ? user.value.data : null,
recentOrders: orders.status === 'fulfilled' ? orders.value.data : [],
unreadCount: notifications.status === 'fulfilled'
? notifications.value.data.count : 0
});
});
Конфігурація Traefik у Kubernetes
# Traefik IngressRoute
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: api-gateway
spec:
entryPoints:
- websecure
routes:
- match: PathPrefix(`/api/orders`)
kind: Rule
services:
- name: order-service
port: 3000
middlewares:
- name: jwt-auth
- name: rate-limit
- match: PathPrefix(`/api/users`)
kind: Rule
services:
- name: user-service
port: 3001
middlewares:
- name: jwt-auth
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: rate-limit
spec:
rateLimit:
average: 100
burst: 50
period: 1m
Версіонування через Gateway
// Версіонування на основі заголовків
app.use((req, res, next) => {
const version = req.headers['api-version'] || 'v1';
if (version === 'v2') {
req.url = req.url.replace('/api/', '/api/v2/');
}
next();
});
Графік реалізації
- Базова конфігурація Kong або Traefik з маршрутизацією та JWT — 3–5 днів
- Налаштування rate limiting, circuit breaker, логування — 2–3 дні
- Агрегуючий шлюз з власною бізнес-логікою — 1–2 тижні







