Reverse proxy vs Load Balancer vs Api Gateway - в чем разница
“Reverse Proxy”, “Load Balancer” и “API Gateway” – давайте на примерах разберемся в чем разница с точки зрения реальной эксплуатации. Инструменты вроде Nginx, HAProxy или Traefik могут брать на себя разные роли в зависимости от того, как вы их настроите. И к выбору надо подходить исходя из требований к архитектуре. Тот же Nginx может завести вас очень далеко… Но обо всём попорядку.
Reverse Proxy cидит перед вашим бэкендом и скрывает его от мира. Зачем? Да потому что тогда вашему приложению придется заниматься тем, чем ему не надо бы заниматься. Например, терминация SSL, отдача статики, включение компрессии gzip и тд. Reverse Proxy берет эту “грязную работу” на себя.
# Пример реализации обычного reverse proxy в Nginx
server {
listen 80;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Балансировщик – ваш оберег от звонков в 4 утра
Главная фишка здесь не в распределении трафика, а в Health checks. Обычный reverse proxy будет слать запросы игнорируя факт, что сервис упал. Неплохим примером будет использовние пассивных хелсчеков вроде max_fails=5 fail_timeout=60s в nginx (активные хелсчеки есть только nginx plus).
# Пример балансировки в Nginx
upstream backend {
server 10.0.0.1:3000 max_fails=5 fail_timeout=60s;
server 10.0.0.2:3000 max_fails=5 fail_timeout=60s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout http_502 http_503;
}
}
Есть разные стратегии балансировки трафика:
- Round Robin: Простая очередь. Хорошо, если серверы одинаковые.
- Least Connections: Отправляет туда, где меньше активных соединений. Идеально для запросов с разным временем обработки.
- IP Hash: Привязывает клиента к серверу по IP. Вообще редкий кейс – использовать только если вы заперты в клетке с монолитом 2010 года выпуска
- Weighted: Если один сервер – мощный зверь с 64 ГБ RAM, а другой – скромная виртуалка, вы распределяете нагрузку пропорционально их силам.
Ну и не забываем что там есть L4 (TCP/UDP) и L7 (HTTP).
API Gateway как “полицейский” на границе ваших микросервисов
API Gateway – это прокси с “высшим образованием”. Он делает вещи, о которых обычный балансировщик даже не догадывается:
- Аутентификация и авторизация: Проверка JWT-токенов или API-ключей на самом входе. Вам же не надо чтобы каждый микросервис реализовывал логику проверки каждого запроса? Вот и я так думаю =)
- Rate Limiting: Если клиент превысил лимит (например, 100 запросов в минуту), шлюз выкинет
429 Too Many Requests. Это защищает ваш бэкенд от перегрузки еще до того, как запрос потребит ресурсы приложения. - Protocol Translation: Например, трансформация внешнего REST в более эффективный внутренний gRPC.
- Request Validation: Шлюз может проверить структуру JSON и отсечь мусор на входе.
- Трансформация и версионность: Добавление заголовков вроде
X-Request-IDдля сквозной трассировки или маршрутизация на/v2на основе заголовков. - Service Discovery:. Современные шлюзы сходят в Consul или Kubernetes, чтобы узнать, где сейчас живут поды сервиса.
services:
- name: user-service
url: http://users-backend-cluster:3000
plugins:
# 1. АУТЕНТИФИКАЦИЯ: Проверка JWT перед тем, как пустить запрос дальше
- name: jwt
config:
secret_is_base64: false
claims_to_verify:
- exp
# 2. RATE LIMITING: Защита бэкенда от перегрузки
- name: rate-limiting
config:
minute: 100
hour: 10Конечно! Давай адаптируем этот пример под более конкретную бизнес-логику — скажем, под сервис заказов (Order Service).
В этой конфигурации мы объединим все плагины, но теперь они будут обслуживать логику оформления покупок.
```yaml
services:
- name: orders-backend
url: http://orders-api.internal:8080
plugins:
# 1. AUTH: Проверяем, что заказ делает авторизованный клиент
- name: jwt
config:
secret_is_base64: false
claims_to_verify:
- exp
# 2. RATE LIMITING: Защищаем создание заказов от спам-ботов
- name: rate-limiting
config:
minute: 50
hour: 500
policy: local
# 3. TRANSFORMATION: Добавляем метаданные для логирования заказа
- name: request-transformer
config:
add:
headers:
- "X-Order-Trace-ID: $(uuid)"
querystring:
- "source: mobile_app"
routes:
# 4. ROUTING: Разделяем стандартные и приоритетные заказы
- name: standard-orders
paths:
- /v1/orders
methods:
- GET
- POST
- name: priority-orders
paths:
- /v1/priority-orders
headers:
X-Priority-Level: ["Gold", "Platinum"]
Самое главное, что надо понять – в основе всего лежит концепция Reverse Proxy:
- Load Balancer – это тип Reverse Proxy, сфокусированный на распределении.
- API Gateway – это тип Reverse Proxy, сфокусированный на управлении API.
[PS] Кстати у least_conn есть один интересная побочка. Угадаете, что будет если backend будет отдавать пустые ответы с 200 кодом?