Мікросервіси: NodeJS
Мікросервіси стали популярною архітектурою для створення масштабованих і гнучких застосунків. У цьому пості я проведу вас через процес створення простих мікросервісів з Node.js, Express і міжсервісної комунікації за допомогою HTTP-запитів. В кінці ви зрозумієте, як мікросервіси можуть працювати разом, створюючи модульні застосунки.
Що таке мікросервіси?
Мікросервіси — це архітектурний стиль, коли застосунки складаються з маленьких, незалежних сервісів. Кожен сервіс відповідає за конкретну бізнес-область і взаємодіє з іншими через API. Такий підхід дозволяє покращити масштабованість, ізоляцію від помилок і швидкість розробки, що робить його популярним вибором для сучасних застосунків.
Давайте розглянемо приклад, створивши два мікросервіси:
- Сервіс користувачів: Керує даними користувачів.
- Сервіс замовлень: Керує замовленнями та отримує деталі користувача з Сервісу користувачів.
Сервіс користувачів: Керування даними користувачів
Сервіс користувачів відповідає за обробку інформації про користувачів. Він надає можливість отримувати дані користувача за ID.
Ось код:
const express = require("express");
const app = express();
app.use(express.json());
const users = [
{ id: 1, name: "John Doe", email: "[email protected]" },
{ id: 2, name: "Jane Smith", email: "[email protected]" },
];
app.get("/users/:id", (req, res) => {
const user = users.find((u) => u.id === parseInt(req.params.id));
if (!user) return res.status(404).json({ error: "User not found" });
res.json(user);
});
app.listen(3001, () => console.log("📡 User Service running on port 3001"));
📦 Сервіс замовлень: Отримання замовлень з даними користувача
Сервіс замовлень не лише керує замовленнями, але й отримує деталі користувача, звертаючись до Сервісу користувачів.
Ось код:
const express = require("express");
const http = require("http");
const app = express();
const orders = [
{ id: 1, userId: 1, item: "Laptop", amount: 1500 },
{ id: 2, userId: 2, item: "Phone", amount: 800 },
];
app.get("/orders/:id", (req, res) => {
const order = orders.find((o) => o.id === parseInt(req.params.id));
if (!order) return res.status(404).json({ error: "Order not found" });
const options = { hostname: "localhost", port: 3001, path: `/users/${order.userId}` };
const request = http.request(options, (response) => {
let data = "";
response.on("data", (chunk) => (data += chunk));
response.on("end", () => {
res.json({ ...order, user: JSON.parse(data) });
});
});
request.on("error", () => res.status(500).json({ error: "Failed to fetch user details" }));
request.end();
});
app.listen(3002, () => console.log("📡 Order Service running on port 3002"));
🔗 Як вони працюють разом
Ось як ці мікросервіси працюють разом:
- Сервіс замовлень отримує замовлення за ID (наприклад,
/orders/1
). - Потім він надсилає HTTP-запит до Сервісу користувачів, щоб отримати деталі користувача.
- Врешті-решт, він комбінує дані про замовлення та користувача в один відповідь.
Приклад відповіді з /orders/1
:
{
"id": 1,
"userId": 1,
"item": "Laptop",
"amount": 1500,
"user": {
"id": 1,
"name": "John Doe",
"email": "[email protected]"
}
}
🎉 Чому мікросервіси?
Мікросервіси пропонують безліч переваг порівняно з традиційними монолітними архітектурами, що робить їх дедалі популярнішим вибором. Ось детальний огляд:
1. Модульність = Простіше обслуговування
- Кожен сервіс зосереджений на конкретній функції (наприклад, управління користувачами, обробка замовлень).
- Менші кодові бази легше розуміти, оновлювати та налагоджувати.
- Розробники можуть ізолювати та виправляти помилки або впроваджувати нові функції без впливу на всю систему.
2.
Незалежний розвиток для команд
- Команди можуть володіти та розробляти конкретні сервіси незалежно, не перешкоджаючи одна одній.
- Наприклад, одна команда може зосередитися на покращенні Сервісу замовлень, а інша — на Сервісі користувачів — без конфліктів!
- Це сприяє співпраці, даючи командам можливість спеціалізуватися.
3. Швидші цикли розгортання
- Кожен сервіс можна розгортати незалежно, зменшуючи ризик глобальних збоїв системи.
- Якщо потрібно оновити один сервіс, не потрібно перезавантажувати весь додаток. 🚀
- Безперервні цикли розгортання стають простіші для управління в малих, незалежних сервісах.
4. Масштабованість: плати тільки за те, що тобі потрібно
- Сервіси можуть масштабуватися незалежно, в залежності від попиту.
- Наприклад, якщо Сервіс замовлень отримує високий трафік, можна виділити більше ресурсів для нього без впливу на інші сервіси.
- Це забезпечує економічно ефективне управління ресурсами. 💡
5. Свобода технологій
- Кожен сервіс може використовувати різний технологічний стек чи мову програмування, якщо вони взаємодіють через API.
- Наприклад, ваш Сервіс користувачів може використовувати Node.js, а Сервіс аналітики — Python.
- Команди можуть вибирати інструменти, які найкраще підходять для їх завдань.
6. Ізоляція помилок
- Помилка в одному сервісі не призведе до збою всього додатка.
- Якщо Сервіс оплати не працює, решта додатка (наприклад, перегляд, додавання товарів до кошика) може продовжувати працювати.
- Це робить ваш додаток більш стійким та покращує досвід користувача.
7. Легше впровадження нових функцій
- Ви можете експериментувати з новими функціями в сервісі, не переживаючи, що це зламає весь додаток.
- Сервіси можуть еволюціонувати та поступово замінюватися, що полегшує підтримку технологічного стеку в актуальному стані.
Готові до розробки? 🙌
Мікросервіси — ідеальне рішення для створення масштабованих, гнучких і стійких систем. Тому спробуйте — почніть з малого, і ви багато чого навчитеся!
Щасливого кодування! 🧑💻
Перекладено з: 🚀 Building Node.js Microservices: A Fun Beginner’s Guide