[Tutorial] Como subir um servidor com RabbitMQ para emitir e gerar notificações?
Motivações
Até surgir uma necessidade real e um motivo, eu nunca havia implementado a comunicação entre microserviços utilizando um Message Broker (RabbitMQ, Kafka), que é basicamente um servidor que recebe e redireciona mensagens para os ouvintes dessas mensagens.
Estou escrevendo este blog post para fixar o conhecimento e também para compartilhar com outros colegas entusiastas sobre como podemos realizar essa implementação.
Para começarmos iremos seguir o seguinte checklist:
- Instaler o Docker
- Execute o container do RabbitMQ
- Criando a producer do RabbitMq
- Criando a consumer do RabbitMq
1. Instaler o container Docker
O primeiro passo para este projeto é instalar o Docker (https://docs.docker.com/engine/install/) para conseguirmos subir a nossa instância do RabbitMQ. Outra opção seria realizar a instalação diretamente em sua máquina, porém, em um mundo onde o uso do Docker é muito mais simples, seguiremos com ele.
- Instaler o Docker ✅
- Execute o container do RabbitMQ
- Criando a producer do RabbitMq
- Criando a consumer do RabbitMq
2. Execute o container do rabbitMq
Após ter instalado o Docker, você poderá executar os containers em sua máquina. Para isso, já preparei um arquivo chamado docker-compose.yml, já configurado para executar uma imagem do RabbitMQ.
version: "3.2"
services:
rabbitmq:
image: rabbitmq:3-management-alpine
container_name: 'rabbitmq'
ports:
- 5672:5672
- 15672:15672
volumes:
- ~/.docker-conf/rabbitmq/data/:/var/lib/rabbitmq/
- ~/.docker-conf/rabbitmq/log/:/var/log/rabbitmq
networks:
- rabbitmq_go_net
networks:
rabbitmq_go_net:
driver: bridge
No meu caso, esse arquivo está dentro de um repositório do Git, mas você pode criar uma pasta específica para esse arquivo. Após ter feito isso, inicie o docker-engine e execute o comando "docker compose up". Se tudo der certo, o seu container irá iniciar e estará disponível em "localhost:15672". Você pode acessar o painel ao acessar essa rota usando o usuário: "guest" e a senha: "guest".
Agora que tudo está configurado, vamos prosseguir para o próximo passo, que envolve o "producer" (sistema que emite a mensagem na fila) e os "consumers" (sistemas que consomem essa mensagem da fila).
- Instaler o Docker ✅
- Execute o container do RabbitMQ ✅
- Criando a producer do RabbitMq
- Criando a consumer do RabbitMq
3. Criando a producer do RabbitMq
A minha "producer" do RabbitMQ foi feita em Java, por isso, os exemplos de código aqui serão em Java. No entanto, você pode replicar os mesmos conceitos para qualquer linguagem (por exemplo, a minha "consumer" será em Node), e essa é uma das vantagens de se usar um broker e microserviços, pois suas soluções são agnósticas em relação às linguagens usadas.
Primeiro, comece adicionando a dependência da biblioteca do RabbitMQ lib para a sua linguagem. Aqui, estou usando o Maven:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.0.0</version>
</dependency>
Em seguida, importe a dependência em sua classe de consumo e estará pronto:
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
public class NotificationQueueProducer {
private static final String QUEUE_NAME = "notification-queue";
public static void main(String[] args) {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setPort(5672);
try {
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String mensagem = "Olá, RabbitMQ!";
channel.basicPublish("", QUEUE_NAME, null, mensagem.getBytes("UTF-8"));
System.out.println(" [x] Mensagem enviada: '" + mensagem + "'");
channel.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Basicamente, a sua "producer" está pronta. Neste exemplo, estamos enviando uma mensagem chamada "Olá RabbitMQ", mas você pode passar diversos tipos de payload, como pode consultar na documentação oficial do RabbitMQ (https://www.rabbitmq.com/getstarted.html).
Uma observação importante é o nome que estamos dando à nossa fila. Caso não exista, ela será criada automaticamente, com as credenciais padrão (user: guest, password: guest), e usaremos as mesmas credenciais para nossa "consumer".
- Instaler o Docker ✅
- Execute o container do RabbitMQ ✅
- Criando a producer do RabbitMq ✅
- Criando a consumer do RabbitMq
4. Criando a consumer do RabbitMq
Agora, iremos criar a nossa "consumer" do RabbitMQ utilizando uma aplicação em Node. O primeiro passo será instalar a biblioteca "amqplib", que é usada no Node para conexão com o broker. Você pode utilizar o Yarn (https://yarnpkg.com/package/amqplib) ou o NPM (https://www.npmjs.com/package/amqplib), ou qualquer outro gerenciador de dependências que tenha surgido após este blogpost ou que você preferir.
Observação: Se estiver usando TypeScript, não esqueça de adicionar os tipos também (npm i @types/amqplib) ou (yarn add @types/amqplib).
Aqui está o código básico utilizado pela "consumer":
import amqp from 'amqplib';
import sendWelcomeEmail from "../useCases/emailNotification/sendWelcomeEmail";
const QUEUE_NAME = 'notification-queue';
async function consumeQueue() {
try {
const connection = await amqp.connect('amqp://localhost');
const channel = await connection.createChannel();
await channel.assertQueue(QUEUE_NAME, { durable: false });
channel.consume(QUEUE_NAME, (msg) => {
if (msg !== null) {
const mensagem = msg.content.toString();
sendWelcomeEmail(mensagem);
console.log('Mensagem recebida:', mensagem);
channel.ack(msg);
}
});
console.log('Consumer iniciado. Aguardando mensagens...');
} catch (error) {
console.error('Erro ao consumir a fila:', error);
}
}
export default consumeQueue;
Antes de testar o código, certifique-se de ter seguido todos os passos e de que todos os serviços estão rodando corretamente.
- Instaler o Docker ✅
- Execute o container do RabbitMQ ✅
- Criando a producer do RabbitMq ✅
- Criando a consumer do RabbitMq ✅
🎉 Parabéns, você completou todos os passos!
Considerações finais
Espero que este tutorial tenha sido útil para vocês de alguma forma. Se tiverem dúvidas ou sugestões, por favor, escrevam nos comentários desta postagem. Até a próxima!
se puderem, apoiem meu BlogPost aqui