Фото від Growtika на Unsplash
У цьому дописі ми розглянемо мікросервіси та створимо базовий додаток із чудовим відкритим пакетом Moleculer JS. Цей допис створений на основі цього чудового відеоуроку від Traversy Media.
Мікросервіси — це інша парадигма, ніж монолітна архітектура, яка використовувалася багато років. Нижче наведено діаграму монолітної архітектури.
Вона створена і розгортається як єдине ціле. Через це її легко розробляти, тестувати та розгортати. Інфраструктура є простішою, і вона будується за допомогою єдиного технологічного стеку, такого як NodeJS чи Springboot. Найбільша проблема монолітної архітектури полягає в тому, що вона може зіткнутися з проблемами під час масштабування.
Тепер давайте розглянемо архітектуру мікросервісів. Це набір маленьких і слабо зв'язаних сервісів. Усі ці сервіси є автономними та можуть розроблятися, розгортатися та масштабуватися незалежно один від одного. Вони взаємодіють через такі протоколи, як HTTP.
Архітектура мікросервісів не прив'язана до конкретної технології, і кожен сервіс може бути створений за допомогою різних технологій. Один може бути створений на NodeJS, інший на Springboot, а інший на .NET.
Однак це додає більше складності до програми. Це має більші витрати на інфраструктуру, тому воно дорожче, ніж моноліт.
Тепер давайте розглянемо розгортання обох архітектур. Оскільки в монолітній архітектурі всі сервіси є модулями, розробка та розгортання на виробництво здійснюються одночасно та на тій самій інфраструктурі.
Але в мікросервісах сервіси є різними, тому й розгортання також різне. Зазвичай розгортання відбувається через окремі інстанси Docker.
Додаток мікросервісів має API-шлюз. Отже, коли ми звертаємося до нього через веб-додаток або мобільний додаток, він маршрутизує запит до різних сервісів. API-шлюз також відповідає за безпеку, обмеження швидкості, ведення журналів та агрегацію.
Тепер давайте поговоримо про переваги мікросервісів: масштабованість, гнучкість, модульність і децентралізованість. Однак є і недоліки, такі як складність і операційні витрати. Управління даними, час розробки та налагодження також потребують часу.
Для нашого демонстраційного мікросервісу ми будемо використовувати чудовий відкритий сервіс Moleculer.
Сервіси, які Moleculer надає з коробки, включають балансування навантаження, стійкість до помилок і виявлення сервісів.
Тепер із терміналу ми створили нову папку під назвою microservices-nodejs, у якій виконали команду npm init -y для створення проекту NodeJS. Потім встановили Moleculer за допомогою команди npm i moleculer.
Ми відкрили проект у VS Code і додали файл .gitignore. Тут ми додали node_modules.
Ми створили файл index.js, а також у файлі package.json додали тип як module. Це дозволить нам використовувати import у проекті NodeJS.
Тепер у файлі 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 буде зупинений.
Тепер створимо папку services в кореневому каталозі. І в ній створимо файл user.service.js. Тут ми знову імпортуємо ServiceBroker і отримуємо екземпляр брокера.
Далі створюємо функцію generateId(), яка генерує унікальний випадковий ідентифікатор, і також маємо масив користувачів. Потім викликаємо createService() і надаємо йому ім'я user. Знову створюємо функцію в діях, яка називається createUser.
Ця функція витягуватиме username та email з ctx.params. Потім вона створює новий об'єкт newUser, використовуючи username, email і унікальний ідентифікатор. Після цього додає newUser в масив користувачів і повертає його.
Також маємо асинхронну функцію getUsers(), яка повертає масив користувачів.
В файлі index.js ми прибрали попередній код і тепер імпортуємо UserService з файлу user.service.js. Далі створюємо асинхронну функцію startApp.
Тут ми спочатку запускаємо UserService за допомогою UserService.start(). Потім створюємо нового користувача за допомогою функції createUser і передаємо їй ім'я користувача та електронну пошту.
Ми виводимо повернутого користувача в консоль, а також викликаємо функцію getUsers, щоб вивести масив користувачів. Також ми додаємо блок catch для обробки помилок. В блоці finally зупиняємо UserService.
Знову запускаємо файл index.js через термінал і отримуємо нового користувача та масив користувачів.
Тепер створимо файл email.service.js в папці services. Тут ми знову використовуємо createService() і всередині нього створюємо функцію sendMail(). Вона приймає отримувача, тему і контент з ctx.params.
Далі ми виводимо в консоль повідомлення про відправку електронної пошти отримувачу з темою. Також виводимо контент. І потім повертаємо текст "Email sent to recipient".
Тепер використовуємо EmailService в файлі index.js. Тут ми також запускаємо EmailService за допомогою start() після того, як імпортуємо його.
Далі ми симулюємо відправку електронної пошти, викликаючи функцію sendEmail, передаючи отримувача, тему та контент. Після цього виводимо результат emailResult в консоль.
Ми також зупиняємо сервіс електронної пошти в блоці finally.
Тепер створимо файл auth.service.js в папці services. Тут за допомогою createService ми знову створюємо функцію authUser. Витягуємо username і password з ctx.params.
Якщо ім'я користувача "admin" і пароль "password", ми повертаємо успіх і повідомлення. Інакше повертаємо помилку з повідомленням.
В файлі index.js ми запускаємо AuthService, а в блоці try симулюємо автентифікацію. Викликаємо функцію authUser з ім'ям користувача і паролем і виводимо результат в консоль.
Ми також зупиняємо AuthService в блоці finally.
У терміналі, коли ми виконали команду node index.js, ми отримуємо всі консольні логи від UserService, EmailService і AuthService.
Це завершує нашу коротку статтю про Microservices, і ви можете знайти код для цього тут.
Перекладено з: Microservices Crash Course with Molecular JS