Курс швидкого ознайомлення з мікросервісами за допомогою Molecular JS

pic
Фото від Growtika на Unsplash

У цьому дописі ми розглянемо мікросервіси та створимо базовий додаток із чудовим відкритим пакетом Moleculer JS. Цей допис створений на основі цього чудового відеоуроку від Traversy Media.

Мікросервіси — це інша парадигма, ніж монолітна архітектура, яка використовувалася багато років. Нижче наведено діаграму монолітної архітектури.

Вона створена і розгортається як єдине ціле. Через це її легко розробляти, тестувати та розгортати. Інфраструктура є простішою, і вона будується за допомогою єдиного технологічного стеку, такого як NodeJS чи Springboot. Найбільша проблема монолітної архітектури полягає в тому, що вона може зіткнутися з проблемами під час масштабування.

pic

Тепер давайте розглянемо архітектуру мікросервісів. Це набір маленьких і слабо зв'язаних сервісів. Усі ці сервіси є автономними та можуть розроблятися, розгортатися та масштабуватися незалежно один від одного. Вони взаємодіють через такі протоколи, як HTTP.

pic

Архітектура мікросервісів не прив'язана до конкретної технології, і кожен сервіс може бути створений за допомогою різних технологій. Один може бути створений на NodeJS, інший на Springboot, а інший на .NET.

Однак це додає більше складності до програми. Це має більші витрати на інфраструктуру, тому воно дорожче, ніж моноліт.

pic

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

Але в мікросервісах сервіси є різними, тому й розгортання також різне. Зазвичай розгортання відбувається через окремі інстанси Docker.

pic

Додаток мікросервісів має API-шлюз. Отже, коли ми звертаємося до нього через веб-додаток або мобільний додаток, він маршрутизує запит до різних сервісів. API-шлюз також відповідає за безпеку, обмеження швидкості, ведення журналів та агрегацію.

pic

Тепер давайте поговоримо про переваги мікросервісів: масштабованість, гнучкість, модульність і децентралізованість. Однак є і недоліки, такі як складність і операційні витрати. Управління даними, час розробки та налагодження також потребують часу.

pic

Для нашого демонстраційного мікросервісу ми будемо використовувати чудовий відкритий сервіс Moleculer.

pic

Сервіси, які Moleculer надає з коробки, включають балансування навантаження, стійкість до помилок і виявлення сервісів.

pic

Тепер із терміналу ми створили нову папку під назвою microservices-nodejs, у якій виконали команду npm init -y для створення проекту NodeJS. Потім встановили Moleculer за допомогою команди npm i moleculer.

pic

Ми відкрили проект у VS Code і додали файл .gitignore. Тут ми додали node_modules.

pic

Ми створили файл index.js, а також у файлі package.json додали тип як module. Це дозволить нам використовувати import у проекті NodeJS.

pic

Тепер у файлі index.js додайте наступний код. Тут ми спочатку імпортуємо ServiceBroker з Moleculer.
З використанням ServiceBroker ми створюємо об'єкт брокера.

Далі ми використовуємо функцію createService з Moleculer через брокера. Тут ми надаємо ім'я greeter і вказуємо функцію sayHello в діях. Вона приймає параметр ctx і повертає привітання з ctx.params.name.

Після цього ми створюємо асинхронну функцію startApp, в якій спочатку запускаємо брокера. Потім за допомогою broker.call() викликаємо функцію sayHello сервісу greeter і передаємо ім'я як Nabendu. Після цього зупиняємо брокера.

В кінці викликаємо функцію startApp. Також, з інтегрованого терміналу запускаємо файл через node index.js. Тут ми побачимо, що сервіс greeter запуститься, потім виведе "Hello Nabendu" і після цього сервіс greeter буде зупинений.

pic

Тепер створимо папку services в кореневому каталозі. І в ній створимо файл user.service.js. Тут ми знову імпортуємо ServiceBroker і отримуємо екземпляр брокера.

Далі створюємо функцію generateId(), яка генерує унікальний випадковий ідентифікатор, і також маємо масив користувачів. Потім викликаємо createService() і надаємо йому ім'я user. Знову створюємо функцію в діях, яка називається createUser.

Ця функція витягуватиме username та email з ctx.params. Потім вона створює новий об'єкт newUser, використовуючи username, email і унікальний ідентифікатор. Після цього додає newUser в масив користувачів і повертає його.

Також маємо асинхронну функцію getUsers(), яка повертає масив користувачів.

pic

В файлі index.js ми прибрали попередній код і тепер імпортуємо UserService з файлу user.service.js. Далі створюємо асинхронну функцію startApp.

Тут ми спочатку запускаємо UserService за допомогою UserService.start(). Потім створюємо нового користувача за допомогою функції createUser і передаємо їй ім'я користувача та електронну пошту.

Ми виводимо повернутого користувача в консоль, а також викликаємо функцію getUsers, щоб вивести масив користувачів. Також ми додаємо блок catch для обробки помилок. В блоці finally зупиняємо UserService.

Знову запускаємо файл index.js через термінал і отримуємо нового користувача та масив користувачів.

pic

Тепер створимо файл email.service.js в папці services. Тут ми знову використовуємо createService() і всередині нього створюємо функцію sendMail(). Вона приймає отримувача, тему і контент з ctx.params.

Далі ми виводимо в консоль повідомлення про відправку електронної пошти отримувачу з темою. Також виводимо контент. І потім повертаємо текст "Email sent to recipient".

pic

Тепер використовуємо EmailService в файлі index.js. Тут ми також запускаємо EmailService за допомогою start() після того, як імпортуємо його.

Далі ми симулюємо відправку електронної пошти, викликаючи функцію sendEmail, передаючи отримувача, тему та контент. Після цього виводимо результат emailResult в консоль.

Ми також зупиняємо сервіс електронної пошти в блоці finally.

pic

Тепер створимо файл auth.service.js в папці services. Тут за допомогою createService ми знову створюємо функцію authUser. Витягуємо username і password з ctx.params.

Якщо ім'я користувача "admin" і пароль "password", ми повертаємо успіх і повідомлення. Інакше повертаємо помилку з повідомленням.

pic

В файлі index.js ми запускаємо AuthService, а в блоці try симулюємо автентифікацію. Викликаємо функцію authUser з ім'ям користувача і паролем і виводимо результат в консоль.
Ми також зупиняємо AuthService в блоці finally.

pic

У терміналі, коли ми виконали команду node index.js, ми отримуємо всі консольні логи від UserService, EmailService і AuthService.

pic

Це завершує нашу коротку статтю про Microservices, і ви можете знайти код для цього тут.

Перекладено з: Microservices Crash Course with Molecular JS

Leave a Reply

Your email address will not be published. Required fields are marked *