Упс! Не вдала спроба:(
Будь ласка, спробуйте ще раз.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

0
9 лютого 2023 11 хвилин читання

Дмитро Чоломбитько, Full Stack Developer в NIX

Продовжую знайомити вас з інструментами Spring Cloud. Сьогодні зупинимось детальніше на конкретних практичних речах.

Spring Cloud Gateway

Якщо ви працювали у хмарі, то напевно стикалися з такою проблемою…

Буває складно забезпечити доступ до особливих API всередині хмарної інфраструктури або поєднати різні розподілені API в одну спільну. Наприклад, вам потрібно зібрати воєдино API до внутрішніх ресурсів та API до систем інших провайдерів. З цим допоможе Spring Cloud Gateway.

Можливості Spring Cloud Gateway не обмежуються цією функціональністю. Також він може менеджерити безпеку. Це відбувається за рахунок єдиного способу авторизації для всіх API. Адже доступ здійснюватиметься лише через цей шлюз. Також цей інструмент дозволяє збирати метрики та моніторити систему.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 1 Spring Cloud Gateway

У Spring Cloud Gateway можна гнучко налаштувати роутинг до кожного API. Це робиться за допомогою шляхів, параметрів, навіть за вмістом request body або за зразком хедерів. Пропоную поглянути, як це працює. Для прикладу працюватимемо у зв'язці з проєктом Circuit Breaker.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 2 Circuit Breaker

Це реалізація однойменного патерна програмування. Його суть полягає у простій обробці помилок та управлінні стабільністю застосунку та інфраструктури загалом. Фактично це перемикач. При появі проблеми він перенаправляє нас на інший ендпойнт або мок, які можуть підтримати систему в робочому стані, поки сервіс, що впав, не відновиться. Можливо, не варто покладатися лише на таке рішення. Але для критичних точок, які важко контролювати, це часто єдиний можливий вихід.

Існує чотири реалізації Circuit Breaker:

  • Netflix Hystrix (deprecated);
  • Resilence4J;
  • Spring Retry;
  • Sentinel.

Роботу Circuit Breaker у зв'язці зі Spring Cloud Gateway я розберу ще на одному прикладі зі стандартним проєктом.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 3 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

У ньому є залежність від Spring Cloud Gateway.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 4 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Все це працює на WebFlux. А ще тут використовується Resilence4J. Саме на нього зараз рекомендується переходити при використанні Circuit Breaker.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 5 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Також зверну увагу на React-версію (через WebFlux) та актуатор за стандартом. А ось проперті тут порожні. У Spring Cloud Gateway можна задавати конфігурацію двома способами: через проперті та через Java. Я покажу другий спосіб.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 6 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Та для початку поясню суть цього прикладу. Припустимо, ми маємо дві API у вигляді простих мікросервісів. Вони повертають деякі дані з бази, і треба зв'язати їх у єдину API. Одна з них надсилає випадкове жіноче або чоловіче прізвище.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 7 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Друга API видає випадкове ім'я, також чоловіче чи жіноче.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 8 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

У Gateway є три класи. Перший — стандартний main.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 9 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Підписуйтеся на наші соцмережі

Другий — це конфігурація роутингу. В нашому випадку вона виглядає завеликою, але для демонстрації можливостей шлюзу підійде й таке виконання.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 10 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

На перший погляд, тут дуже багато фільтрів. Усе здається незрозумілим. Але насправді все достатньо просто. Коли треба позначити зв'язування з віддаленою API, насамперед слід вказати шлях, яким працюватиме Gateway.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 11 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Якщо Gateway запущений на порті 8080, це буде localhost8080/name/male. Далі переходимо до реального шляху для віддаленої API, яку ми фактично проксуємо. Це потрібно вказати через uri.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 12 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Якби у нас не було гарного фільтра, система просто підставила би name/male на адресу після localhost8080, після адреси name-мікросервісу.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 13 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Для прикладу я свідомо ускладнив ситуацію. Припустимо, API не збігаються повністю. Тому потрібно зробити ремапінг. Можна переписати шляхи або додати фільтр, щоб підключити Circuit Breaker. Через це rewritepath приймає регулярне вираження, яке дозволяє витягувати параметри зі шляху в Gateway. Для цього треба написати, що є name, а потім забрати все, що йде після наступного слешу, і перенести на новий шлях. Таким чином можна переробити шлях під використання в цільовій API.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 14 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Переходимо до Circuit Breaker. Нижче зображена реалізація обробника помилок, який перемикатиме нас при отриманні запитів 404, 500 або 504. За потреби можете вказати будь-які інші коди.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 15 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Також треба вказати, куди все це пересилатиметься. Для цього я використовую мок усередині Gateway — це fallback endpoint.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 16 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

З появою помилки у відправленні випадкового чоловічого імені повертатиметься лише одне ім'я — я задав «Артур». Щойно мікросервіс відновиться, все працюватиме, як слід.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 17 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Після запуску у браузері можна оцінити результати роботи системи.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 18 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Аналогічно працюють і жіночі імена. Все це підтверджує коректне налаштування Spring Cloud Gateway та мікросервісів на портах 8090 та 8091.

Але припустимо, щось зламалося, скажімо, на отриманні імені. Для симуляції розкоментуємо цю помилку і перебілдимо мікросервіс.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 19 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Реакція перемикача передбачувана: при зверненні до браузера ми бачимо лише ім'я Артур, скільки б разів не оновлювали сторінку.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 20 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Далі виправляємо помилку та дивимося, що змінилося. Мікросервіси не пов'язані з Gateway безпосередньо, тут не використовується Discovery Server. Весь зв'язок побудований на тому, що система періодично стукається до мікросервісу і в разі виявлення помилки повертається на fallback endpoint. Після виправлення багу і відновлення роботи сервісу ми знову бачимо в браузері випадкові імена. Все працює, як і має бути.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 21 Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow

Звісно, регулярне звернення до ендпойнту не є гарною практикою. У реальному проєкті все можна налаштувати коректніше. Наприклад, під конкретний застосунок задати тайм-аут, потрібну кількість спроб для обробника помилок тощо.

Spring Cloud Config Server

Це веб-застосунок для управління конфігураційними файлами. Особливо корисним Config Server буде за наявності автоскейлінгу, який створює інстанси та їх конфігурації без участі розробника.

Можна прокидати в хмарі конфігурації через проперті в консольних командах, але, на мій погляд, це сумнівна практика. Набагато краще використовувати готові, стандартизовані рішення. Це дозволить зберігати конфігурації в одному місці та спростить контроль доступу та версіонування. Саме таким рішенням є Spring Cloud Config Server. Як він працює?

Уявімо програму, яка хоче запуститися. Її створює, наприклад, якийсь executor, і застосунку потрібно отримати актуальну конфігурацію. Для цього йому достатньо відправити своє ім'я та потрібний список профілів на спеціальний ендпойнт у Config Server. Від нас не потрібні мануальні дії. Все просто, стабільно, безпечно.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 22 Spring Cloud Config Server

Spring Cloud Config Server може використовувати для зберігання та вилучення проперті декілька рішень. Найчастіше це Git. Також це можуть бути версіоновані або звичайні файлові системи, бази даних, Redis, сховище Amazon S3, CredHub (якщо ви користуєтесь CloudFoundry) та ін.

Config Server передбачає шифрування для проперті, які не можна зберігати у відкритому доступі. Для цього потрібно викликати спеціальний ендпойнт у Config Server. Потім свій ключ із префіском «{cipher}» помістити у репозиторій замість проперті і зберігати це все у такому вигляді. Коли застосунок вимагатиме проперті, Config Server за допомогою ключа розшифрує все і передасть застосунку.

Існує й альтернатива від іншого вендора — Vault від HashiCorp. Це не Spring-застосунок, а сховище ентерпрайз-рівня для зберігання ключів. Його особливість — оптимізація під зашифроване розміщення ключів, як у базі даних.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 23 Spring Cloud Config Server

Spring Cloud Config Bus

Цей інструмент дозволяє автоматично оновлювати проперті на сервісах при настанні будь-якої події. Це здійснюється за допомогою підключення Message Broker. Припустимо, ми зробили commit у Git-репозиторій, до якого підключено спеціальний WebHook. Він слухає зміни в Git і сам викликає спеціальний ендпойнт у Config Server. Потім у Message Broker з'являється повідомлення, яке слухають мікросервіси. Його поява і викликає оновлення конфігурацій. Виходить досить зручна система.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 24 Spring Cloud Config Bus

Spring Cloud для хмарних платформ

У Spring Cloud є модулі для всіх основних хмар: від AWS та Azure до GCP і навіть Alibaba. Останній активно розвивається в Китаї. Також існує модуль для Docker із Kubernetes. Кожен надає різні можливості, про які можна багато писати. Тож у межах цієї статті я наведу лише ключові функції по кожній платформі.

AWS:

  • Реалізація Spring Messaging API для SQS;
  • Реалізація Spring Cache API для ElastiCache;
  • Інтеграція з RDS;
  • Інтеграція з S3;
  • Шляхи CloudFormation;
  • Інтеграції з EC2, CloudWatch, SES, Lambda.

Azure:

  • Spring Cloud Stream Binder для Azure Event Hubs;
  • Spring Cloud Stream Binder для Azure Service Bus Topic та Queue;
  • Spring Resource Abstraction для Azure Storage;
  • Автоконфігурація Spring Cache для Azure Cache для Redis;
  • Функції Spring Cloud в Azure.

Google Cloud Platform:

  • Spring Cloud GCP Pub/Sub, зокрема Spring Integration Channel Adapters;
  • Spring Cloud GCP Pub/Sub Stream Binder;
  • Spring Resource Abstraction для Google Cloud Storage;
  • Spring Data Cloud Spanner;
  • Spring Data Cloud Datastore;
  • Spring Data Cloud Firestore;
  • Google Cloud Vision API Template.

Alibaba:

  • Контроль флоу та деградації сервісів: Alibaba Sentinel;
  • Реєстрація та виявлення сервісів: інстанси можна зареєструвати із Alibaba Nacos, а клієнти можуть виявити інстанси за допомогою компонентів, керованих Spring;
  • Розподілена конфігурація: використання Alibaba Nacos як сховища даних;
  • Подійно-орієнтовані мікросервіси: створення високомасштабованих та поєднаних із Spring Cloud Stream RocketMQ Binder мікросервісів, які керуються подіями;
  • Message Bus: вузли зв'язку розподілених систем із Spring Cloud Bus RocketMQ;
  • Розподілені транзакції Seata.

Kubernetes:

  • Спеціальний інструмент інтеграції для платформи Kubernetes;
  • Конфігурація хмари (карта);
  • Гнучка реалізація Cloud Config Server;
  • Балансування навантаження на стороні клієнта через Netflix Ribbon.

Spring Data Flow

Це інтегрована платформа для обробки даних. За допомогою Data Flow можна на UI налаштувати спосіб перетворення даних, що надходить від запиту HTTP. Також платформа дозволяє зберегти дані та пізніше автоматично створювати під них мікросервіси. Все відбуватиметься без вашого безпосереднього втручання. Потрібно лише змапити все, щоб платформа розуміла, що саме піднімати. Якщо немає даних — немає й сервісів. Та тільки-но дані з'явилися, то відразу через Kubernetes підіймаються кілька сервісів.

Інструменти Spring Cloud: знайомимось із Gateway, Config Server, Config Bus та Spring Data Flow зображення 25 Spring Data Flow

Цікаво? Усі розглянуті у статті приклади ви можете знайти на моєму репозиторії на GitHub.

Якщо ви хочете поділитися з читачами SPEKA власним досвідом, розповісти свою історію чи опублікувати колонку на важливу для вас тему, долучайтеся. Відтепер ви можете зареєструватися на сайті SPEKA і самостійно опублікувати свій пост.
0
Icon 0

Підписуйтеся на наші соцмережі

Інші матеріали

Як підібрати КВЕД для ФОП бізнес-тренера, який надає послуги з коучингу?

Inna Sharova 17 годин тому

Акумулятори для СЕС: як не помилитись з вибором?

Антон Березинський 12 червня 2025 15:55

Айдентика Дизаріуму 2024 здобула золото у конкурсі Ukrainian Design: The Very Best Of – успіх мережі ТВОРИ!

Юліана Сомар 11 червня 2025 15:33

Як синергія маркетинг та продакт команд допомагає будувати бізнеси-єдинороги

Brainstack 11 червня 2025 22:35

Секрети утримання курсу: топ-інсайти з воркшопу Алекса Момота та Kumeka team

Тарас Мазур 12 червня 2025 15:24