- PVSM.RU - https://www.pvsm.ru -
Со временем, каждый проект растет и реализовывать новый функционал в существующий монолит становится все сложнее, дольше и дороже для бизнеса.
Один из вариантов решения данной проблемы — использование микросервисной архитектуры. Для новичков или для тех, кто впервые сталкиваются с данной архитектурой, может быть сложно понять, с чего начать, что нужно делать, а что делать не стоит.
В этой статье будет написан простейший микросервис на Nodejs & RabbitMQ, а также показан процесс миграции монолита на микросервисы.
Для начала реализуем простой gateway, который будет принимать запросы по HTTP, слушая определенный порт.
Разворачиваем RabbitMQ (через него наши микросервисы и gateway будут общаться):
$ docker run -d -p 5672:5672 rabbitmq
Инициализируем проект и устанавливаем NPM-пакет micromq [1]:
$ npm init -y
$ npm i micromq -S
// импортируем класс Gateway из раннее установленного пакета micromq
const Gateway = require('micromq/gateway');
// создаем экземпляр класса Gateway
const app = new Gateway({
// названия микросервисов, к которым мы будем обращаться
microservices: ['users'],
// настройки rabbitmq
rabbit: {
// ссылка для подключения к rabbitmq (default: amqp://guest:guest@localhost:5672)
url: process.env.RABBIT_URL,
},
});
// создаем два эндпоинта /friends & /status на метод GET
app.get(['/friends', '/status'], async (req, res) => {
// делегируем запрос в микросервис users
await res.delegate('users');
});
// начинаем слушать порт
app.listen(process.env.PORT);
Как это будет работать:
// импортируем класс MicroService из раннее установленного пакета micromq
const MicroMQ = require('micromq');
// создаем экземпляр класса MicroService
const app = new MicroMQ({
// название микросервиса (оно должно быть таким же, как указано в Gateway)
name: 'users',
// настройки rabbitmq
rabbit: {
// ссылка для подключения к rabbitmq (default: amqp://guest:guest@localhost:5672)
url: process.env.RABBIT_URL,
},
});
// создаем эндпоинт /friends для метода GET
app.get('/friends', (req, res) => {
// отправляем json ответ
res.json([
{
id: 1,
name: 'Mikhail Semin',
},
{
id: 2,
name: 'Ivan Ivanov',
},
]);
});
// создаем эндпоинт /status для метода GET
app.get('/status', (req, res) => {
// отправляем json ответ
res.json({
text: 'Thinking...',
});
});
// начинаем слушать очередь запросов
app.start();
Как это будет работать:
Предположим, что у нас уже есть приложение на express, и мы хотим начать его переносить на микросервисы.
Оно выглядит следующим образом:
const express = require('express');
const app = express();
app.get('/balance', (req, res) => {
res.json({
amount: 500,
});
});
app.get('/friends', (req, res) => {
res.json([
{
id: 1,
name: 'Mikhail Semin',
},
{
id: 2,
name: 'Ivan Ivanov',
},
]);
});
app.get('/status', (req, res) => {
res.json({
text: 'Thinking...',
});
});
app.listen(process.env.PORT);
Мы хотим вынести из него 2 эндпоинта: /friends и /status. Что нам для этого нужно сделать?
В примере выше, когда мы создавали микросервис users, мы реализовали два метода /friends и /status, который делают то же самое, что делает наш монолит.
Для того, чтобы проксировать запросы в микросервис из gateway, мы воспользуемся тем же пакетом, подключив middleware в наше express приложение:
const express = require('express');
// импортируем класс MicroService из раннее установленного пакета micromq
const MicroMQ = require('micromq');
const app = express();
// создаем экземпляр класса MicroService
const app = new MicroMQ({
// название микросервиса (оно должно быть таким же, как указано в Gateway)
name: 'users',
// настройки rabbitmq
rabbit: {
// ссылка для подключения к rabbitmq (default: amqp://guest:guest@localhost:5672)
url: process.env.RABBIT_URL,
},
});
// подключаем middleware в монолит, который позволит нам делегировать запросы
app.use(gateway.middleware());
// не трогаем этот эндпоинт, потому что мы не планируем переносить его в микросервис
app.get('/balance', (req, res) => {
res.json({
amount: 500,
});
});
// создаем два эндпоинта /friends & /status на метод GET
app.get(['/friends', '/status'], async (req, res) => {
// делегируем запрос в микросервис users
// метод res.delegate появился благодаря middleware, которую мы подключили выше
await res.delegate('users');
});
// слушаем порт
app.listen(process.env.PORT);
Это работает так же, как в примере выше, где мы писали чистый Gateway. В этом примере разница лишь в том, что запросы принимает не Gateway, а монолит, написанный на express.
Это я расскажу в следующей статье, если читателям понравится эта.
Автор: Mikhail Semin
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/313832
Ссылки в тексте:
[1] micromq: https://github.com/bifot/micromq
[2] https://mysite.com/friends: https://mysite.com/friends
[3] Ссылка на пакет в NPM-registry: https://www.npmjs.com/package/micromq
[4] Примеры кода, приведенные в статье: https://github.com/bifot/micromq/tree/master/examples
[5] Источник: https://habr.com/ru/post/447074/?utm_source=habrahabr&utm_medium=rss&utm_campaign=447074
Нажмите здесь для печати.