Переклад та адаптація Java Microservices: A Practical Guide . Посилання на першу частину гайду . Будь-яка серверна Java-програма, а отже, і будь-який мікросервіс це просто файл з розширенням .jar або .war. Є одна чудова річ про екосистему Java, або, скоріше, про JVM: достатньо написати Java-код один раз, і його можна запускати майже на будь-якій операційній системі, якщо ви не скомпілювали свій код з новішою версією Java, ніж ваша цільова версія JVM . Це важливо розуміти, особливо коли йдеться про такі теми, як Docker, Kubernetes або (барабанний дріб!) The Cloud. Чому? Давайте розглянемо різні сценарії розгортання.
Приклад мінімалістичного розгортання мікросервісу Java
Продовжуємо приклад із банком. Отже, ми отримали файл monobank.jar (моноліт) та наш нещодавно витягнутий riskengine.jar (перший мікросервіс перевірки ризиків). Припустимо також, що обом програмам, як і будь-якому іншому застосунку у світі, потрібен файл .properties. У нашому випадку він міститиме лише URL бази даних та облікові дані. Мінімальне розгортання може складатися з двох каталогів, що виглядають приблизно так: Перший:
-r-r------ 1 ubuntu ubuntu 2476 Nov 26 09:41 application.properties
-r-x------ 1 ubuntu ubuntu 94806861 Nov 26 09:45 monobank-384.jar
ubuntu@somemachine:/var/www/www.monobank.com/java$ java -jar monobank-384.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
...
Другий:
-r-r------ 1 ubuntu ubuntu 2476 Nov 26 09:41 application.properties
-r-x------ 1 ubuntu ubuntu 94806861 Nov 26 09:45 risk-engine-1.jar
ubuntu@someothermachine:/var/www/risk.monobank.com/java$ java -jar risk-engine-1.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
...
Це залишає відкритим питання: як файли .properties і .jar потраплять на сервер? На жаль, відповідей може бути багато.
Як використовувати інструменти збирання, SSH та Ansible для розгортання мікросервісів Java
Нудна, але від цього не менш прекрасна порада про те, як розгортати Java-мікросервіси… Власне, так само, як системні адміністратори розгортали будь-яку серверну Java-програму в компаніях за останні 20 років. Це мікс:- вашого улюбленого інструменту для збирання (Maven, Gradle)
- старого доброго SSH/SCP для копіювання .jars на сервери
- сценаріїв Bash для керування сценаріями розгортання та серверами
- або навіть краще: деякі скрипти Ansible.
Як використовувати Docker для розгортання мікросервісів Java
Повернімося до солодких мук вибору. Кілька років тому на сцену вийшов Docker, а разом із ним — контейнеризація. Якщо ви ніколи з ним не працювали, ось короткий опис, розрахований на кінцевих користувачів та розробників:- Контейнер (спрощений) схожий на стару добру віртуальну машину, але "легше". Якщо вам незрозуміло, що означає “легше” у цьому контексті, ласкаво просимо вивчити цю відповідь на Stackoverflow .
- Контейнер гарантує власну переносимість. Тобто він працює де завгодно. Звучить знайомо, чи не так?
- об'єднайте ваш jar-файл у образ Docker
- передайте цей образ до приватного Docker-реєстру
- витягніть та запустіть цей образ на вашій цільовій платформі
- або скопіюєте образ Docker прямо у вашу прод-систему та запустіть його.
Як використовувати Docker Swarm або Kubernetes для розгортання мікросервісів Java
Допустимо, ви вирішабо випробувати Docker. Щоразу, коли ви розгортаєте Java-мікросервіс, ви створюєте образ Docker, який поєднує ваш файл .jar. Нехай у вас є пара таких мікросервісів Java, і ви хочете розгорнути ці служби на декількох машинах (у кластері). Виникає питання: як управляти цим кластером? Запускати контейнери Docker, перевіряти працездатність, розгортати поновлення, масштабувати систему (бррр)? Дві можливі відповіді на це запитання — Docker Swarm та Kubernetes. Детальний опис обох варіантів занадто затягне це і без того довгий посібник, проте вважаємо важливим згадати, що обидва варіанти зрештою покладаються на те, що ви пишете YAML-файли (див. розповіді про відступи Yaml) для керування вашим кластером. Якщо хочете знати, які почуття це викликає на практиці, просто вбийте у пошук Twitter такий запит. Таким чином, процес розгортання для ваших мікросервісів Java тепер виглядає приблизно так:- Налаштування та керування Docker Swarm/Kubernetes
- Усі кроки по Docker (див. вище)
- Пишіть і виконуйте YAML,
поки ваші очі не заплющутьпоки все не запрацює.
Як протестувати мікросервіси Java
Припустимо, ви вирішабо впровадити мікросервіси у продакшн. Як тепер протестувати інтеграцію n-мікросервісів під час розробки? Як побачити, чи працює повний робочий процес, а не лише окремі його частини? На практиці можна застосувати один із трьох способів:- Небагато попрацювавши (якщо ви використовуєте фреймворки, такі як Spring Boot), ви можете об'єднати всі ваші мікросервіси в один клас запуску та завантажити всі мікросервіси за допомогою одного класу Wrapper.java — залежно від того, чи достатньо пам'яті на вашому комп'ютері для запуску всіх ваших мікросервісів.
- Ви можете скопіювати налаштування Docker Swarm або Kubernetes локально.
- Просто більше не проводьте інтеграційні випробування локально. Натомість розгорніть спеціальне середовище DEV/TEST. Це те, що насправді робить чимало команд, що піддаються біль локальних мікросервісних установок.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ