Реализация 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 aggregates data from multiple services
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
Versioning через Gateway
// Header-based versioning
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 недели







