Первая неделя на новом проекте. Открываю схему архитектуры, жду квадратики и стрелочки — а вижу только стрелки. Повсюду. Сорок семь микросервисов, и такое ощущение, что каждый соединили с каждым по линейке и без всякого плана. Никакого 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 в часы, которые никто не любит.
Но вот честный тест архитектуры: можешь ли ты пройти по сбою, не открывая шесть терминалов, и может ли один плохой сервис испортить вечер всем остальным? Если ответы «да» и «нет» — вот теперь можно спать.
Если твои микросервисы общаются напрямую, без шлюза между ними, — у тебя пока нет архитектуры. У тебя бомба с часовым механизмом и, пока что, хорошим аптаймом.
Трейсил когда-нибудь продовый сбой по пяти сервисам, имея на руках только сырые логи и оптимизм? Я — да. Одного раза хватило.