Kaip sukurti mikropaslaugų architektūrą naudojant Node.js ir RabbitMQ
Įvadas
Mikro paslaugų architektūra yra būdas sukurti keičiamo dydžio programinę įrangą, suskaidant ją į mažesnes ir nepriklausomas programas, vadinamas paslaugomis. Tai leidžia organizacijoms sukurti atsparią, lanksčią, lengvai prižiūrimą ir keičiamo dydžio programinę įrangą, kad jos galėtų konkuruoti ir patenkinti augančius poreikius.
Šiame straipsnyje mes išnagrinėsime „Microservice Architecture“ koncepciją ir įdiegsime pagrindinę mikropaslaugomis pagrįstą programinę įrangą naudodami „Node.js“ ir „RabbitMQ“.
Mikropaslaugų architektūros pagrindai
Kas yra mikropaslaugos?
Mikropaslaugos yra individualių ir autonominių programų, atliekančių tiksliai apibrėžtą funkciją, rinkinys, kuris sudaro programinės įrangos dalį. Programos, sukurtos naudojant šį architektūrinį stilių, susideda iš mažesnių savarankiškai diegiamų komponentų, kurie bendrauja tarpusavyje per pranešimų tarpininkus, tokius kaip RabbitMQ arba kitus protokolus, tokius kaip HTTP. Tai yra ryškus kontrastas monolitinėms programoms, kurios yra sukurtos kaip vieningas vienetas.
„Microservices“ architektūra prieš monolitinę architektūrą
Kaip minėjome anksčiau, mikropaslaugų architektūra naudojama kuriant programinę įrangą, suskaidant ją į atskirus komponentus, kurie tvarko konkrečias verslo logikos dalis, pvz., vartotojo autentifikavimą ar pranešimus. Kai pastatyta monolitinė programa, nėra atskyrimo; visi komponentai yra vienos kodų bazės dalis.
Programa, sukurta naudojant mikropaslaugų architektūrą, yra labai keičiamo dydžio ir lengvai prižiūrima, nes kiekviena paslauga yra diegiama, prižiūrima ir keičiama atskirai. Šis metodas taip pat daro jį moduliniu, o tai reiškia, kad komponento pakeitimai neturi įtakos visai sistemai, o klaidos yra lokalizuotos konkrečioje paslaugoje.
Iš esmės mikropaslaugos yra atsparios, nes paslaugos veikia atskirai ir nepriklausomos viena nuo kitos, o paslaugos gedimas nepažeidžia sistemos. Skirtingai nuo monolitinės programos, kai kodų bazės klaida gali sugadinti visą programą.
Mikropaslaugos taip pat yra technologijų agnostinės, o tai reiškia, kad kiekviena paslauga gali būti sukurta naudojant pasirinktą technologijų krūvą. Tai suteikia aukšto lygio lankstumo kuriant sprendimus.
Pranešimų brokerių samprata
Pranešimų brokeris yra programinė įranga, palengvinanti paslaugų ryšį. Tai užtikrina, kad mikropaslaugos tarpusavyje patikimai keistųsi pranešimais ir informacija. Tai palengvina paslaugų ryšį net tada, kai jos parašytos skirtingomis kalbomis ar sistemomis, nes suteikia standartizuotą duomenų srauto tvarkymo priemonę.
Pranešimų brokeriai valdo keitimąsi pranešimais tarp gamintojo ir vartotojo. Tai gali būti įgyvendinta naudojant Publish-Prenumerata (Publikacija-Prenumerata) arba Pranešimų eilės modelį.
„Pub-Sub“ sistemoje gamintojas siunčia pranešimą į kanalą, kuriame prenumeruoti vartotojai gali gauti šią žinutę. Message Queue modelyje gamintojas siunčia pranešimus į konkrečią eilę, kur vienas vartotojas jį suvartoja, po vartojimo pranešimas pašalinamas iš eilės.
Mikropaslaugų diegimas naudojant Node.js ir RabbitMQ
Šiame skyriuje mes sukursime paprastą programinę įrangą, įdiegiančią mikro paslaugų architektūrą naudodami RabbitMQ ir Node.js. Mes sukursime tris paslaugas: Produkto, Užsakymo ir Pranešimų paslaugas.
Projekto nustatymas
Pirmiausia sukurkite savo programos katalogą, tada inicijuokite projektą ir įdiekite priklausomybes:
mkdir ./path_to_project_directorynpm init -ynpm install express amqplib dotenv
RabbitMQ sąranka
Galite nustatyti „RabbitMQ“ naudodami „Docker“ vietoje naudodami diegimo failą arba naudodami valdomą paslaugą, pvz., „CloudAMPQ“.
CloudAMPQ yra visiškai valdoma RabbitMQ paslauga, kuri automatizuoja sąranką, mastelio keitimą ir veikimą. „CloudAMPQ“ turi įvairius prenumeratos planus, įskaitant nemokamą planą.
Docker sąranka
Ištraukime „RabbitMQ docker“ vaizdą:
docker pull rabbitmq
Dabar paleiskite:
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
Tai paleidžia RabbitMQ serverį prie 5672 prievado ir valdymo sąsają 15672 (numatytasis vartotojo vardas / slaptažodis yra svečias).
Vietinis diegimas
Atsisiųskite RabbitMQ diegimo failą kartu su konkrečiomis OS instrukcijomis. Paleiskite diegimo programą ir vykdykite diegimo instrukcijas. Įsitikinkite, kad serveris veikia:
„Windows“:
rabbitmq-service start
Linux:
systemctl status rabbitmq-server.service
tada
sudo service rabbitmq-server restart
MacOS:
brew services start rabbitmq
„CloudAMPQ“ sąranka
Tai lengviausias būdas nustatyti RabbitMQ, kurį naudosime šiame straipsnyje. Eikite į „CloudAMPQ“ registracijos puslapį ir susikurkite paskyrą. Sukurti egzempliorių; Suteikite jam pavadinimą, pasirinkite nemokamą planą, pasirinkite regioną ir užbaikite sąranką.
Nustatę RabbitMQ nukopijuokite ryšio URL amqps://username:(email protected)/vhost
Produkto paslaugos kūrimas
Produkto paslauga valdo produkto kūrimą ir paskelbia pranešimą produkto_eilei, kurį sunaudos Užsakymų tarnyba.
Sukurkite produktų paslaugų katalogą:
mkdir product_service
cd product_service
Sukurkite failą index.js.
Nukopijuokite šį kodą:
require('dotenv').config(); // Load environment variables
const express = require('express');
const amqp = require('amqplib/callback_api');
const app = express();
app.use(express.json());
let channel;
// Connect to RabbitMQ
amqp.connect(process.env.RABBITMQ_URL, (err, conn) => {
if (err) throw err;
conn.createChannel((err, ch) => {
if (err) throw err;
channel = ch;
channel.assertQueue('product_queue', { durable: false });
});
});
// Product endpoint
app.post('/product', (req, res) => {
const product = req.body;
// Publish product creation event to RabbitMQ
channel.sendToQueue('product_queue', Buffer.from(JSON.stringify(product)));
res.status(201).send(`Product created: ${product.name}`);
});
// Use port from environment variable
app.listen(process.env.PRODUCT_SERVICE_PORT, () => {
console.log(`Product service running on port ${process.env.PRODUCT_SERVICE_PORT}`);
});
Sukurkite .env failą ir pridėkite ryšio informaciją:
RABBITMQ_URL= *your connection URL*
Pridėti PRODUCT_SERVICE_PORT=3000
į .env failą.
paleisti node index.js
Užsakymų tarnybos kūrimas
Tai išklauso produkto kūrimo įvykį, apdoroja užsakymus ir paskelbia užsakymą order_queue, kurį sunaudos pranešimų tarnyba.
Sukurkite užsakymo paslaugų katalogą iš savo projekto šakninio katalogo:
mkdir order_service
cd order_service
Sukurkite failą index.js.
Parašykite šį kodą:
require('dotenv').config();
const express = require('express');
const amqp = require('amqplib/callback_api');
const app = express();
app.use(express.json());
let channel;
// Connect to RabbitMQ
amqp.connect(process.env.RABBITMQ_URL, (err, conn) => {
if (err) throw err;
conn.createChannel((err, ch) => {
if (err) throw err;
channel = ch;
channel.assertQueue('product_queue', { durable: false });
// Consume product creation events
channel.consume('product_queue', (msg) => {
const product = JSON.parse(msg.content.toString());
console.log(`Received product: ${product.name}`);
// Handle product logic (e.g., create order)
}, { noAck: true });
});
});
// Order endpoint
app.post('/order', (req, res) => {
const order = req.body;
// Publish order event to RabbitMQ
channel.sendToQueue('order_queue', Buffer.from(JSON.stringify(order)));
res.status(201).send(`Order created for product: ${order.product}`);
});
// Use port from environment variable
app.listen(process.env.ORDER_SERVICE_PORT, () => {
console.log(`Order service running on port ${process.env.ORDER_SERVICE_PORT}`);
});
Sukurkite .env failą ir pridėkite ryšio informaciją:
RABBITMQ_URL= *your connection URL*
Pridėti ORDER_SERVICE_PORT=3001
į .env failą.
Bėk node index.js
Pranešimų tarnybos sukūrimas
Ši tvarka siunčia pranešimus, kai pateikiami užsakymai.
Sukurkite pranešimų paslaugų katalogą:
mkdir notification_service
cd notification_service
Sukurkite failą index.js
Parašykite šį kodą:
require('dotenv').config();
const express = require('express');
const amqp = require('amqplib/callback_api');
const app = express();
app.use(express.json());
let channel;
// Connect to RabbitMQ
amqp.connect(process.env.RABBITMQ_URL, (err, conn) => {
if (err) throw err;
conn.createChannel((err, ch) => {
if (err) throw err;
channel = ch;
channel.assertQueue('product_queue', { durable: false });
// Consume order events
channel.consume('order_queue', (msg) => {
const order = JSON.parse(msg.content.toString());
console.log(`Notification: Order placed for product ${order.product}`);
// Handle notification logic (e.g., send email)
}, { noAck: true });
});
});
app.listen(process.env.NOTIFICATION_SERVICE_PORT, () => {
console.log(`Notification service running on port ${process.env.NOTIFICATION_SERVICE_PORT}`);
});
Sukurkite .env failą ir pridėkite ryšio informaciją:
RABBITMQ_URL= *your connection URL*
Pridėti NOTIFICATION_SERVICE_PORT=3002
į .env failą.
paleisti node index.js
Sąrankos testavimas
Savo paslaugoms išbandyti naudosime „Postman“.
Produktų aptarnavimas
Užsakymo paslauga
Pranešimų tarnyba
Pranešimai registruojami konsolėje pagal order_queue įvykius
Išvada
Įdiegusios mikro paslaugų architektūrą, organizacijos galėjo sukurti keičiamo dydžio ir atsparias programas. Kūrimo ir priežiūros procesas tampa racionalesnis dėl didesnio moduliškumo, o ištekliai naudojami efektyviai.
Šiame atpirkimo sandoryje yra kodas.
Jei turite klausimų, palikite juos toliau pateiktuose komentaruose.
Viršelio vaizdas naudojant makrovektorių „Freepik“.