open atlas
↑ К треку
Основы System Design SD · 03 · 02

Обратный прокси и API-шлюз

Обратный прокси стоит перед серверами; API-шлюз добавляет сквозные заботы — аутентификацию, rate-limit, маршрутизацию, агрегацию, терминацию TLS. Оба централизуют контроль, но оба могут стать узким местом и SPOF. Знай, когда шлюз окупается, а когда он избыточен.

SD Middle ◷ 18 min
Уровень
ОсновыJuniorMiddleSenior

Компания разбила монолит на двенадцать микросервисов, и за месяц каждая команда независимо переписала одни и те же четыре вещи: проверку JWT, rate-limit, логирование запросов и CORS. Четыре оказались чуть разными, две — с багами аутентификации, а клиенту теперь надо было знать двенадцать хостов и двенадцать причуд аутентификации. Решением стал API-шлюз — одна парадная дверь, делавшая аутентификацию, rate-limit и маршрутизацию один раз, чтобы сервисы вернулись к бизнес-логике. Полгода спустя тот же шлюз стал причиной того, что опечатка в конфиге в 2 часа ночи уронила все двенадцать сервисов разом. Шлюз решил проблему дублирования и тихо стал единственным, что может уронить всю платформу. Оба факта истинны, и старший навык — держать их одновременно. К концу этого урока ты будешь точно знать, где именно живёт этот компромисс — и когда стоит от него отказаться.

Прямой прокси против обратного: на чьей они стороне

Эти двое — зеркальные отражения, и разница в том, на чьей стороне прокси.

Прямой прокси (forward proxy) стоит перед клиентами и представляет их интернету. Корпоративный egress-прокси, VPN, исходящий прокси скрапера — сервер на той стороне видит адрес прокси, а не клиента. Он существует, чтобы служить клиенту: кэширование, фильтрация контента, анонимность, контроль исходящего.

Обратный прокси (reverse proxy) стоит перед серверами и представляет их интернету. Клиенты подключаются к обратному прокси, думая, что это и есть сервер; он пересылает к одному из нескольких бэкендов за ним. Он существует, чтобы служить серверной стороне: прячет топологию, терминирует TLS, кэширует ответы, сжимает и балансирует нагрузку. Каждый балансировщик из прошлого урока — это обратный прокси с привинченной политикой выбора сервера; nginx, Envoy и HAProxy — канонические примеры.

Мнемоника: прямой прокси защищает и обслуживает тех, кто делает запросы; обратный прокси защищает и обслуживает тех, кто на них отвечает.

Что API-шлюз добавляет сверху

Обратный прокси двигает запросы. API-шлюз (API gateway) — это обратный прокси, взявший на себя сквозные заботы прикладного уровня — то, что иначе переписывал бы каждый сервис (хук). Стандартный набор:

  • Аутентификация и авторизация — проверить токен / API-ключ один раз на периметре, чтобы каждый сервис доверял уже аутентифицированной личности, а не перепроверял.
  • Rate-limit и квоты — троттлить по клиенту/ключу/маршруту, защищая бэкенды от злоупотреблений и шумных соседей.
  • Маршрутизация — отображать публичные пути на внутренние сервисы (/orders → order-service), часто с версией (/v2/...).
  • Агрегация / композиция — разветвить один клиентский вызов на несколько бэкендов и сшить ответы, чтобы мобильный клиент делал один запрос вместо шести.
  • Терминация TLS — завершать HTTPS на периметре, чтобы внутренние хопы были дешевле (уровень композиции — см. трек networking про то, как устроено рукопожатие TLS; здесь важно лишь где оно заканчивается).
  • Наблюдаемость и трансформации — логирование, заголовки трассировки, переписывание запроса/ответа, трансляция протокола (REST ↔ gRPC).

Ценность реальна: сквозная политика живёт в одном месте, применяется единообразно, а клиенты видят один связный API вместо твоей оргструктуры.

Почему это работает

Зачем вообще централизовать эти заботы, а не сделать общую библиотеку, которую импортирует каждый сервис? Библиотека всё равно едет в процессе каждого сервиса, на языке каждого сервиса, и обновить фикс безопасности — значит передеплоить двенадцать сервисов и надеяться, что ни один не отстал. Аутентификация/rate-limit на шлюзе делает политику единым деплоем, который меняешь один раз, а действует он мгновенно на всё — и позволяет применить её к сервисам на языках, никогда не импортировавших твою библиотеку. Компромисс зеркален: то, что меняешь один раз, — это и то, что, изменённое неправильно, ломает всё один раз. Централизация превращает N проблем дублирования политики в один выигрыш консистентности и один риск радиуса поражения.

Шлюз как узкое место и SPOF

Всё, что шлюз централизует, он же и концентрирует. Каждый запрос к каждому сервису течёт через него, поэтому:

  • Это единая точка отказа. Если шлюз упал или сконфигурирован неверно, все сервисы за ним недостижимы, независимо от их собственного здоровья (опечатка в 2 ночи из хука). Митигация — плейбук балансировщика: запускать шлюз как избыточный, горизонтально масштабируемый пул за собственным балансировщиком с health-checks — никогда как один инстанс.
  • Это узкое место по пропускной способности. Весь трафик плюс вся работа на запрос (парсинг токена, поиски rate-limit, TLS, агрегация) ложится на один уровень, который теперь должен масштабироваться впереди всех бэкендов вместе взятых.
  • Это налог на задержку. Он добавляет хоп и CPU на запрос к каждому вызову. Обычно мало, но реально, и это на критическом пути всего.
  • Это затор деплоя. Если конфиг маршрутизации каждой команды живёт в шлюзе, команда шлюза становится узким местом для релизов — организационная версия технического SPOF.

Альтернатива: sidecar / service mesh

Централизованный шлюз — одна форма; service mesh (сервисная сетка) — другая. Вместо единого центрального уровня сетка запускает маленький прокси (sidecar, например Envoy) рядом с каждым инстансом сервиса. Сквозные заботы для трафика сервис-к-сервису (east-west) — mTLS, ретраи, таймауты, circuit breaking, балансировка, трассировка — переезжают в sidecar’ы, конфигурируясь централизованно, но исполняясь локально. Нет единого прокси, через который обязан протекать весь внутренний трафик, поэтому SPOF и узкое место центрального уровня для east-west-вызовов в основном растворяются; цена — операционная сложность (прокси на каждый под, control plane для управления) и небольшая задержка на хоп от локального прокси.

Эти двое на практике не «или-или»: шлюз обычно ведёт north-south трафик (клиенты → платформа: аутентификация, публичные rate-limit, публичная поверхность API), а сетка ведёт east-west (сервис → сервис: mTLS, ретраи, внутренняя маршрутизация). Тянись к сетке, когда внутренний трафик между множеством сервисов — это место твоих проблем надёжности и безопасности; тянись к шлюзу, когда проблема — представить один безопасный, связный API наружу.

Частая ошибка

Шлюз часто избыточен, и заводить его рефлекторно — реальная ошибка. Если у тебя один-два сервиса, один публичный API и нет проблемы дублирования между командами, API-шлюз добавляет хоп, SPOF, новую штуку для эксплуатации и затор деплоя, решая проблему, которой у тебя нет — твой обратный прокси / балансировщик уже делает TLS и маршрутизацию. Хуже — бог-шлюз: команды продолжают пихать в шлюз бизнес-логику, трансформацию запросов и сшивание ответов, пока он не станет распределённым монолитом, который каждая команда обязана координировать, чтобы менять, воссоздавая ту самую связанность, которую микросервисы должны были разорвать. Держи шлюз тонким (политика и маршрутизация, не бизнес-логика) и не вводи его, пока дублированные сквозные заботы между несколькими сервисами реально не заболят.

Викторина

Трафик ноутбука идёт через корпоративный egress-сервер, скрывающий твой IP от сайтов; трафик твоего сайта приходит через nginx, который публика видит как сайт. Что есть что?

Викторина

Опечатка в конфиге маршрутизации в 2 ночи на твоём единственном API-шлюзе делает все двенадцать сервисов за ним недостижимыми, хотя каждый сервис здоров. Корень проблемы и правильный структурный фикс?

Закончи аналогию

Вместо того чтобы гнать весь внутренний трафик сервис-к-сервису через один центральный шлюз, сервисная _______ запускает маленький прокси (sidecar) рядом с каждым инстансом сервиса, так что сквозные east-west заботы вроде mTLS, ретраев и таймаутов конфигурируются централизованно, но исполняются локально — без единого центрального уровня-узкого-места.

Вспомните перед уходом
  1. 01
    Различи прямой и обратный прокси и где сюда вписывается балансировщик.
  2. 02
    Перечисли, что API-шлюз добавляет сверх обычного обратного прокси, и главный компромисс.
  3. 03
    Когда тянуться к service mesh вместо (или вместе со) шлюза?
Итог

Прямой прокси стоит перед клиентами (представляет тебя наружу); обратный прокси стоит перед серверами (клиенты думают, что это сервер) и ведёт терминацию TLS, кэширование и балансировку — каждый балансировщик есть обратный прокси с политикой выбора сервера. API-шлюз — это обратный прокси, вобравший сквозные заботы прикладного уровня: аутентификацию, rate-limit, маршрутизацию по пути, агрегацию запросов, терминацию TLS и наблюдаемость, чтобы каждый сервис перестал их переписывать (хук). Эта централизация — подлинный выигрыш консистентности и подлинный риск: шлюз становится единой точкой отказа (SPOF — single point of failure), узким местом пропускной способности, налогом на задержку и затором деплоя, поэтому обязан быть избыточным горизонтально масштабируемым пулом за своим балансировщиком и оставаться тонким. Service mesh — альтернатива для east-west (сервис-к-сервису) трафика: sidecar-прокси (небольшой прокси-процесс рядом с каждым инстансом сервиса) на инстанс, конфигурируемый централизованно, но исполняемый локально, без единого уровня для протекания. Тянись к шлюзу для north-south (публичный API) и к сетке для east-west; и не добавляй ни то ни другое рефлекторно — шлюз перед одним-двумя сервисами избыточен, а бог-шлюз, набитый бизнес-логикой, воссоздаёт монолит, который он должен был разорвать. Теперь, когда столкнёшься с ночным сбоем, роняющим все сервисы разом, — при том что каждый сервис по отдельности здоров, — знай: первым делом смотри на общий уровень перед ними.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 7 завершено
Связанные уроки

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.