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

Інструменти Spring Cloud: практичний ґайд для розробників

IT-команда NIX
IT-команда NIX
7 лютого 2023 10 хвилин читання

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

Під час запуску Spring-програм у хмарі не обійтися без Spring Cloud. Він помітно спрощує та пришвидшує всі операції. Інструменти Spring Cloud дозволяють легко створювати та розгортати у хмарі застосунки. Також є можливості для управління Discovery Server, менеджменту конфігурацій, роутингів.

Хоча модулі Spring Cloud призначені для застосунків на мікросервісній архітектурі, деякі з них можна використовувати у звичайних спрингових програмах. Наприклад, таким є сервер конфігурацій.

Натепер існує понад 30 модулів для Spring Cloud. Вони охоплюють буквально всі напрями роботи у хмарі. Якщо у вас виникла якась проблема, пов'язана з розгортанням застосунку у хмарі, то, ймовірно, її можна вирішити за допомогою одного з цих модулів:

Модулі Spring Cloud Модулі Spring Cloud

Discovery Server — що це?

Рідко у хмарі запускається одна копія кожного з пов'язаних мікросервісів. Щоб забезпечити стабільність програми та підвищити її продуктивність, варто розгорнути кілька інстансів. Однак тоді буде складно вирішити, як краще організувати спільний доступ кількох мікросервісів. Не зрозуміло, як їм дізнаватися про актуальний шлях один до одного, як балансувати навантаження, як керувати помилками.

Одне з поширених рішень — розмістити мікросервіси під балансувальник навантаження. Це дозволить створити єдину для всіх копій DNS-адресу, через яку надходитимуть звернення та будуватимуться зв'язки. Також ви зможете налаштувати балансування навантаження та хелсчеки, щоб керувати падіннями мікросервісів.

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

Spring Cloud Spring Cloud

На допомогу приходить Discovery Server. По суті, це спеціальна нода в клауді, яка реєструє всі мікросервіси всередині хмари. Мікросервіс надсилає запит до Discovery Server, а той заносить його до свого реєстру. Коли до цього мікросервісу захоче звернутися інший мікросервіс, все станеться автоматично. Нам навіть не треба знати шлях у застосунку до початкового сервісу. З реєстром у Discovery Server ми можемо легко зматчити відповідні ім'я та шлях. Це можливо завдяки зв'язці, що описує шлях до сервісу, який він сам і надав під час реєстрації.

З Discovery Server балансування навантаження переходить від провайдера до клієнта. В результаті ви можете обрати будь-який інструмент для балансування навантаження  і налаштувати в ньому будь-які правила без огляду на обмеження провайдера. Також Discovery Server допомагає кешувати шляхи. У разі виклику мікросервісу із закешованим шляхом не потрібно звертатися до реєстру. Так ви зекономите кілька мілісекунд, а це важливо за умови жорсткого latency.

Spring Cloud Spring Cloud

Як працювати з Discovery Server

Один із прикладів Discovery Server — Spring Cloud Eureka. Інструмент розробили у Netflix, та згодом він став opensource-продуктом. Eureka має альтернативи, що підтримуються в Spring Cloud: Apache Zookeeper, Consul та Kubernetes для Docker.

Для застосування будь-якого Discovery Server у Spring Cloud треба створити проєкт із використанням серверної залежності. Далі включити цей сервер завдяки анотації, а потім задізейблити клієнтський модуль за допомогою проперті у конфігурації.

У Spring Boot програм за замовчуванням є клієнтський проперті для підключення до цього сервера. І якщо не задізейблити все на сервері, він намагатиметься підключитися до самого себе. На стороні клієнта ще простіше — варто лише додати клієнтську залежність. Для зручності також можна прописати параметр зі спеціальним ID цієї ноди. Тоді за наявності Eureka Server на локальному хості за портом 8761 підключення буде автоматичним.

Spring Boot Spring Boot

Розглянемо для прикладу найпростіший Eureka Server.

Eureka Server Eureka Server

У ньому є стандартна залежність із netflix-eureka-server.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

Майже в кожен застосунок додано актуатор. Це дозволяє трекати стан ноди.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

Також тут є лише один стартовий клас main.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

Вся магія створюється конфігурацією та однією залежністю. Вона вказує, що ми хочемо підняти сервер на порту 8761, що це Discovery Server і відключення всіх клієнтських проперті.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

Також є застосунок, middle client. Він буде підключатися до сервера та реєструвати себе. Це звичайний Spring WebClient, який повертає просте ping-повідомлення з ім'ям програми та ID її інстансу.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

У цьому випадку мені довелося витягнути залежність EurekaClient, щоб показати ID кожної ноди. Далі я запущу три копії цього інстансу в окремих консолях.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

У параметрах у мене вказаний порт 0, тому порти будуть різні, і нам не треба буде самостійно мапити їх.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

Також кожен інстанс має свій ID.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

Викликати цей middle client без використання URL буде інший застосунок. Він є стороннім HTTP-клієнтом.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

У цього клієнта є залежність у вигляді Eureka-клієнту.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

В обох випадках є найпростіший метод ping, який буде викликатися віддалено.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників
Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

Цей метод робитиме remote call на middle client.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

При цьому в URL використовується назва самого клієнта.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

У результаті можна передавати назву потрібних сервісів і використовувати їх в URL для віддаленого виклику без повного шляху до сервісу.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

Запущений Eureka Server можна отримати за портом 8761. У Spring для цього клієнта є повноцінний UI, який показує стан хмари. Тут можна знайти багато корисної інформації. Це можуть бути технічні дані. Наприклад, час сервера, аптайм, кількість пам'яті тощо.

Eureka Server Eureka Server

В окремій таблиці відображаються інстанси. У нас вже зареєструвалося три копії middle client.

Eureka Server Eureka Server

Можна перейти на актуатор або викликати його метод ping, який покаже ID клієнта. Цей номер є випадковим для кожного мікросервісу та не повинен повторюватися.

Eureka Server Eureka Server

Також після запуску та реєстрації тут з'являється HTTP-клієнт.

Eureka Server Eureka Server

При виклику методу ping на цьому кордонному HTTP-клієнті ми будемо отримувати відповідь від іншого клієнта без використання URL, тільки на основі імені.

Eureka Server Eureka Server

Ми запустили три копії. Балансування навантаження між ними виконується на стороні клієнта, це описується інструкцією LoadBalance. Завдяки цьому відбувається послідовний виклик кожного сервісу, доступний із Discovery Server.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

ID сервісу щоразу змінюється. Тобто балансування працює лише за рахунок однієї анотації. При вимкненні кожного застосунку в Discovery Server надходитиме повідомлення про падіння і можливість відключення.

Інструменти Spring Cloud: практичний ґайд для розробників Інструменти Spring Cloud: практичний ґайд для розробників

Описаний приклад — найпростіший. І балансування, і керування розумними шляхами ви можете кастомізувати під свої завдання.

Навіщо потрібні репліки Eureka

Discovery Server є центральною ланкою інфраструктури, тому цей інструмент повинен мати високий запас міцності. При падінні Discovery Server клієнти можуть деякий час прожити і без нього, якщо вони робили якісь запити і на стороні клієнта є кешування. Однак усі нові копії під час спроби реєстрації будуть періодично видавати повідомлення на кшталт «Я не можу підключитися». Тому для Discovery Server теж вигадали реплікацію. В Eureka вона майже нативна та працює завдяки тому, що сам сервер стає клієнтом.

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

Розглянемо роботу реплікації. На ілюстрації — застосунок з одним main-класом. Це і є Discovery Server.

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

Для створення реплікації на цьому сервері потрібно вказати в client property інший Discovery Server.

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

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

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

У нас є дві конфігурації, peer1 та peer2, які працюють на різних портах. Не можна запустити репліки на одній локальній машині, тому що Eureka прив'язується до назви хоста. Доводиться йти на хитрощі і прописувати hostname в DNS-параметрах hosts в папці C:/Windows/System32/drivers/etc/. Інакше це все просто не запрацює.

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

Запускаємо peer1…

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

Завдяки наявності двох реплік можна показати, як вони взаємодіють одна з одною. Запускати peer2 краще одночасно з першим.

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

Якщо пауза між стартами буде занадто великою, то перша репліка не зможе знайти другу і видаватиме помилку.

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

Саме з цієї причини я виставив threshold у 30 секунд. Так репліки встигнуть синхронізуватись.

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

Після запуску одного з інстансів на порті 8081 буде видно репліку 1. У реєстрі Discovery Server вона представлена у двох примірниках:

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

Також вона показує, що має репліку на порті 8082.

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

При відкритті цього порту ситуація стає прямо протилежною — там видно репліку на 8081.

Навіщо потрібні репліки Eureka Навіщо потрібні репліки Eureka

Тож у разі падіння Discovery Server така проста реплікація зробить ваш застосунок та хмарну інфраструктуру надійнішою.

Це ще не все. У наступній статті я опишу ще кілька корисних інструментів. Йдеться про Gateway, Config Server, Config Bus та Spring Data Flow.

Якщо ви хочете поділитися з читачами SPEKA власним досвідом, розповісти свою історію чи опублікувати колонку на важливу для вас тему, долучайтеся. Відтепер ви можете зареєструватися на сайті SPEKA і самостійно опублікувати свій пост.
50 UAH 150 UAH 500 UAH 1000 UAH 3000 UAH 5000 UAH
0
Прокоментувати
Інші матеріали

«Мерседес» посеред шосе і що з ним робити: правила успішної спільної роботи з вендором

Владислав Миронович 10 квітня 2024 14:00

Minecraft — це не тільки розвага: як працює навчальна платформа Minecraft Education

Владислав Миронович 9 квітня 2024 13:30

Проєкти Open source для розробників: 7 суттєвих переваг і 4 незначні недоліки

IT-команда NIX 8 квітня 2024 19:00

Зв’язок шостого покоління: навіщо він потрібен та коли його чекати

Владислав Миронович 8 квітня 2024 14:00

Топ 7 хмарних сховищ для ваших файлів

Сергій Коноплицький 5 квітня 2024 10:17