Первая неделя на новом проекте. Открываю схему архитектуры, жду квадратики и стрелочки — а вижу только стрелки. Повсюду. Сорок семь микросервисов, и такое ощущение, что каждый соединили с каждым по линейке и без всякого плана. Никакого Azure API Management, никакой единой точки входа — просто паутина прямых вызовов, чистый хаос микросервисов, который невозможно ни отследить, ни ограничить, ни защитить.

Задал команде самый простой вопрос, какой пришёл в голову: как вы дебажите упавший запрос? Ответ сказал мне всё. «Грепаем логи по шести сервисам и надеемся, что таймстемпы совпадут».

В этот момент я понял, на что смотрю. Это была не архитектура. Это была цепная реакция, которой просто не хватало повода.

Вторник, когда всё рвануло

Ждать пришлось недолго. Один сервис начал чудить и завалил соседний ретраями. Тот не выдержал, что породило новые ретраи, а те утянули за собой ещё три сервиса по цепочке. Каскад, в проде, во вторник после обеда — потому что у нас, видимо, всё взрывается именно по вторникам.

Что делало это особенно больно. Между сервисами не было никакой авторизации, поэтому кто угодно мог дёрнуть кого угодно. Не было rate limiting — один хулиган мог залить трафиком всю систему. И не было трейсинга: когда всё шло вразнос, единственным инструментом оставался «грепни и молись». Это не observability. Это молитва с командной строкой.

Один gateway перед всем

Решение было не экзотическим. Решением была дисциплина. Я поставил Azure API Management перед всей этой кашей, чтобы каждый вызов шёл через шлюз, а не ломился в чёрный ход соседнего сервиса.

На границе gateway теперь делает то, что сервисы тихо игнорировали:

  • OAuth и валидация JWT на входе — чтобы сервисы перестали делать вид, что доверяют друг другу по умолчанию.
  • Mutual TLS между шлюзом и бэкендами.
  • Rate limiting на клиента, на подписку, на продукт — чтобы один сорвавшийся вызывающий больше никогда не уронил всю цепочку.
  • Полный трейсинг запроса от точки входа до бэкенда и обратно — чтобы упавший запрос можно было пройти по шагам, а не гадать.

Команда перешла от «грепаем шесть логов и надеемся» к «открываем дашборд шлюза и смотрим». Один этот сдвиг изменил то, как ощущались недели на дежурстве.

Политики как код, а не клики в портале

Gateway, который настраивают руками в портале, — это просто новое место для недокументированных изменений. Поэтому ничего из этого не живёт в портале. Всё живёт в Terraform.

Сам инстанс APIM управляется через Terraform. Определения API импортируются прямо из OpenAPI-спеков, которые сервисы и так публикуют. XML-шаблоны политик — rate limits, авторизация, реврайты — лежат под версионным контролем и проходят ревью, как любой другой код. Потому что политика, которая решает, кто может дёрнуть твой API, заслуживает не меньше внимания, чем функция форматирования даты.

Промоушен идёт через один pipeline: dev, staging, prod — одни и те же определения, ноль дрейфа. Никто не «поправит по-быстрому что-то в проде» и не забудет сказать об этом остальному миру. Если этого нет в Git — этого не существует.

Шлюз не должен стать новой единой точкой отказа

Тут очевидная ловушка. Ты три месяца делаешь gateway парадной дверью для сорока семи сервисов — и теперь именно шлюз может уронить их все разом. Ты не убрал единую точку отказа, ты её переселил и повесил логотип покрасивее.

Поэтому деплой — мультирегиональный и active-active. Обновления катятся blue-green: плохой релиз откатывается назад, а не забирает с собой парадную дверь. Шлюзу, который должен был устранить единую точку отказа, не позволено тихо ею стать.

Сделай правильно, сделай в коде, спи спокойно

Вся трансформация заняла три месяца — от спагетти до единого, наблюдаемого, управляемого кодом шлюза. Работа была не гламурная. Львиная доля — это чтение OpenAPI-спеков, споры о scope политик и тесты failover в часы, которые никто не любит.

Но вот честный тест архитектуры: можешь ли ты пройти по сбою, не открывая шесть терминалов, и может ли один плохой сервис испортить вечер всем остальным? Если ответы «да» и «нет» — вот теперь можно спать.

Если твои микросервисы общаются напрямую, без шлюза между ними, — у тебя пока нет архитектуры. У тебя бомба с часовым механизмом и, пока что, хорошим аптаймом.

Трейсил когда-нибудь продовый сбой по пяти сервисам, имея на руках только сырые логи и оптимизм? Я — да. Одного раза хватило.