Перший тиждень на новому проєкті. Відкриваю схему архітектури, чекаю на квадратики і стрілочки — а бачу лише стрілки. Усюди. Сорок сім мікросервісів, і таке відчуття, що кожен з'єднали з кожним по лінійці й без жодного плану. Жодного 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 у години, які ніхто не любить.

Але ось чесний тест архітектури: чи можеш ти пройти по збою, не відкриваючи шість терміналів, і чи може один поганий сервіс зіпсувати вечір усім іншим? Якщо відповіді «так» і «ні» — ось тепер можна спати.

Якщо твої мікросервіси спілкуються навпростець, без шлюзу між ними, — у тебе поки що немає архітектури. У тебе бомба з годинниковим механізмом і, поки що, хорошим аптаймом.

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