Projeto com objetivo de servir como base de estudo. Ele demonstra uma prática de arquitetura de microsserviços desacoplada e orientada a eventos, utilizando Spring Boot para a lógica de aplicação e RabbitMQ como Message Broker para comunicação assíncrona.
O sistema é composto por dois serviços principais:
user-service(Produtor): Uma API REST para o cadastro de novos usuários.email-service(Consumidor): Um serviço que escuta eventos de novos cadastros e envia e-mails de boas-vindas.
- Java 25
- Spring Boot
- Spring Data JPA: (Persistência de dados)
- Spring AMQP: (Integração com RabbitMQ)
- Spring Mail: (Envio de e-mails via SMTP)
- PostgreSQL: (Banco de dados)
- RabbitMQ: (Message Broker)
- Lombok: (Redução de código boilerplate)
- Jakarta Validation: (Validação de DTOs)
O fluxo de dados é projetado para assíncrono, garantindo que o cadastro do usuário seja rápido e que o envio de e-mail (uma operação mais lenta e sujeita a falhas externas) não bloqueie a resposta ao cliente.
- Um cliente envia uma requisição
POST /userspara ouser-service. - O
user-servicevalida os dados de entrada (UserRecordDto). - O
user-servicesalva o novoUserModelem seu próprio banco de dados PostgreSQL. - Após a persistência, o
user-service(através doUserProducer) publica uma mensagem contendo os detalhes do e-mail (em formatoEmailDto) na fila do RabbitMQ. - O
email-service(através doEmailConsumer) está constantemente escutando a fila. Ao receber uma nova mensagem, ele a consome. - O
EmailConsumerconverte a mensagem (EmailRecordDto) e chama oEmailService. - O
EmailServicetenta enviar o e-mail real usandoJavaMailSender(SMTP). - Independentemente do sucesso (
SENT) ou falha (ERROR) do envio, oEmailServicesalva um registro (EmailModel) em seu próprio banco de dados PostgreSQL, servindo como um log de auditoria.
- JDK 17 ou superior
- Maven ou Gradle
- Um servidor RabbitMQ (CloudAMQP ou local)
- Dois bancos de dados PostgreSQL (um para o
user-servicee outro para oemail-service) - Uma conta Gmail com Senha de App configurada (para o serviço de e-mail).
Cada serviço (ms-user e ms-email) possui seu próprio arquivo application.properties.
Configure a conexão com o banco de dados de usuários e com o RabbitMQ.
# server.port=8081 (sugestão)
# Configuração do Banco de Dados (Usuários)
spring.datasource.url=jdbc:postgresql://localhost:5432/ms-user-db
spring.datasource.username= username
spring.datasource.password= senha
spring.jpa.hibernate.ddl-auto=updateRecomendação: use porta 8082 para o outro serviço.
spring.rabbitmq.addresses=amqps://... (Sua URL do CloudAMQP) broker.queue.email.name=default.email