Com o tempo, cada projeto cresce e a implementação de novas funcionalidades em um monólito existente se torna mais difícil, mais longa e mais cara para os negócios.
Uma das soluções para esse problema é o uso da arquitetura de microsserviço. Para iniciantes ou iniciantes nessa arquitetura pela primeira vez, pode ser difícil descobrir por onde começar, o que precisa ser feito e o que não vale a pena.
Este artigo escreverá o microsserviço mais simples no Nodejs e RabbitMQ e também mostra o processo de migração de um monólito para microsserviços.
O que há na arquitetura de microsserviço?
- Gateway O servidor principal que recebe solicitações e as redireciona para o microsserviço desejado. Na maioria das vezes, não há lógica de negócios no gateway.
- Microsserviço. O próprio microsserviço, que processa solicitações do usuário com lógica de negócios claramente definida.
- Transporte Essa é a parte pela qual o Gateway & Microservice se comunicará. O transporte pode ser HTTP, gRPC, RabbitMQ, etc.
Porquê RabbitMQ?
Obviamente, você não pode usar o RabbitMQ, existem outras opções de comunicação entre microsserviços. O mais simples é o HTTP, existe o gRPC do Google.
Eu uso o RabbitMQ, porque acho bastante simples começar a escrever microsserviços, confiáveis e convenientes, pois você pode ter certeza de que, quando uma mensagem é enviada para a fila, a mensagem chegará ao microsserviço (mesmo que esteja desativado no momento e depois ligado) ) Graças a essas vantagens, você pode escrever microsserviços confiáveis e usar uma implantação contínua.
Iniciar
Primeiro, implementamos um gateway simples que receberá solicitações HTTP enquanto ouve uma porta específica.
Implementamos o RabbitMQ (através dele nossos microsserviços e gateway se comunicarão):
$ docker run -d -p 5672:5672 rabbitmq
Inicializamos o projeto e instalamos o pacote micromq NPM:
$ npm init -y $ npm i micromq -S
Escrevendo um gateway
Como vai funcionar:
- O servidor inicia, começa a ouvir a porta e a receber solicitações
- O usuário envia uma solicitação para https://mysite.com/friends
- O gateway, de acordo com a lógica que descrevemos, delega a solicitação:
3.1 Uma mensagem está sendo enviada (parâmetros de solicitação, cabeçalhos, informações de conexão etc.) para a fila RabbitMQ
3.2 O microsserviço ouve essa fila, processa uma nova solicitação
3.3 Microservice envia uma resposta para a fila
3.4 O gateway escuta uma fila de resposta, recebe uma resposta de um microsserviço
3.5 O gateway envia uma resposta ao cliente - O usuário recebe uma resposta.
Escrevemos um microsserviço
Como vai funcionar:
- O microsserviço é iniciado, começa a ouvir a fila de solicitações na qual o Gateway gravará.
- O microsserviço recebe a solicitação, processa-a, executando todos os middlewares disponíveis
- Microservice envia uma resposta ao Gateway
3.1 A mensagem está sendo enviada (cabeçalhos, corpo de resposta do código HTTP) para a fila RabbitMQ
3.2 O gateway escuta essa fila, recebe uma mensagem, encontra um cliente para o qual precisa enviar uma resposta
3.3 Gateway envia uma resposta para o cliente
Migração de monólito para arquitetura de microsserviço
Suponha que já tenhamos um aplicativo expresso e desejemos começar a portá-lo para microsserviços.
É assim:
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);
Queremos obter 2 pontos finais: / friends e / status. O que precisamos fazer para isso?
- Coloque a lógica de negócios em um microsserviço
- Implementar a delegação de solicitações para esses dois pontos de extremidade no microsserviço
- Obtenha resposta do microsserviço
- Enviar resposta ao cliente
No exemplo acima, quando criamos o microsserviço de usuários, implementamos dois métodos / friends e / status, que fazem a mesma coisa que o nosso monólito.
Para solicitar solicitações de proxy ao microsserviço do gateway, usaremos o mesmo pacote conectando o middleware ao nosso aplicativo expresso:
const express = require('express');
Isso funciona da mesma maneira que no exemplo acima, onde escrevemos um Gateway limpo. Neste exemplo, a única diferença é que não é o Gateway que aceita solicitações, mas um monólito escrito em expresso.
O que vem a seguir
- RPC (chamada de ação remota) de um microsserviço para um monólito / gateway (por exemplo, para autorização)
- Comunique-se entre microsserviços através de filas RabbitMQ para obter mais informações, porque cada microsserviço possui seu próprio banco de dados
Eu já disse isso no artigo "Aprendendo a se comunicar entre microsserviços no Node.js através do RabbitMQ" .