Este Ă© um projeto de estudo que implementa uma arquitetura de microsserviços para o cadastro de usuários e o envio de e-mails de boas-vindas. A comunicação entre os serviços Ă© feita de forma assĂncrona utilizando RabbitMQ, garantindo desacoplamento e resiliĂŞncia.
- VisĂŁo Geral da Arquitetura
- Tecnologias Utilizadas
- Funcionalidades
- Pré-requisitos
- Como Configurar e Executar
- Como Testar a Aplicação
- Estrutura do Projeto
O projeto é composto por dois microsserviços principais:
-
ms-user (Microsserviço de Usuário):
- Responsável por expor uma API REST para o cadastro de novos usuários.
- Salva os dados do usuário em seu próprio banco de dados PostgreSQL.
- ApĂłs o cadastro, publica uma mensagem em uma fila do RabbitMQ com os detalhes para o envio do e-mail.
-
ms-email (Microsserviço de E-mail):
- Responsável por "escutar" a fila do RabbitMQ.
- Ao receber uma nova mensagem, consome os dados e utiliza um serviço de e-mail (SMTP, neste caso, do Gmail) para enviar um e-mail de boas-vindas.
- Salva um registro de cada e-mail enviado (ou que falhou) em seu prĂłprio banco de dados PostgreSQL.
[Cliente API] --(1. POST /users)--> [ms-user] --(2. Salva no BD)--> [DB Usuários]
|
|--(3. Publica Mensagem)--> [RabbitMQ]
|
|--(4. Consome Mensagem)--> [ms-email] --(5. Envia E-mail)--> [Servidor SMTP]
|
|--(6. Salva Log no BD)--> [DB E-mails]
- Linguagem: Java 17
- Framework: Spring Boot 3
- Banco de Dados: PostgreSQL
- Mensageria: CloudAMQP -> RabbitMQ
- Comunicação: API REST
- DependĂŞncias Principais:
- Spring Web
- Spring Data JPA
- Spring for RabbitMQ
- Spring Boot Validation
- Spring Mail Sender
- PostgreSQL Driver
- ✅ Cadastro de Usuário: Endpoint
POST /users
para criar um novo usuário. - ✅ Validação de Dados: Validação de campos obrigatórios (
@NotBlank
) e formato de e-mail (@Email
). - âś… Comunicação AssĂncrona: Envio de eventos para o RabbitMQ apĂłs o cadastro bem-sucedido.
- ✅ Envio de E-mail: Serviço de envio de e-mails transacionais de boas-vindas.
- ✅ Persistência de Dados: Cada microsserviço gerencia seu próprio banco de dados, seguindo o padrão Database per Service.
- âś… Log de E-mails: O
ms-email
armazena um histĂłrico dos e-mails enviados e seu status (SENT
ouERROR
).
Antes de começar, você precisará ter as seguintes ferramentas instaladas em seu ambiente:
- JDK 17 ou superior
- Maven ou Gradle
- PostgreSQL
- Docker (opcional, para rodar o PostgreSQL e o RabbitMQ) ou uma instância do RabbitMQ (como o CloudAMQP, que está configurado no projeto)
- Uma IDE de sua preferĂŞncia (IntelliJ IDEA, VSCode, Eclipse)
- Um cliente de API como o Postman ou Insomnia
Siga os passos abaixo para rodar a aplicação localmente.
git clone <url-do-seu-repositorio>
cd <nome-da-pasta>
VocĂŞ precisa criar dois bancos de dados no seu PostgreSQL:
ms-user
ms-email
O projeto está configurado para usar uma instância do CloudAMQP. A fila default.email
será criada automaticamente pelo ms-email
ao iniciar, pois a propriedade durable
está como true
.
O ms-email
usa uma conta do Gmail para enviar e-mails.
Para usar o Gmail, vocĂŞ precisa:
- Ativar a verificação em duas etapas na sua conta Google.
- Gerar uma "Senha de App" (App Password). Saiba como aqui.
Depois, atualize o arquivo application.properties
do ms-email com suas credenciais:
# src/main/resources/application.properties (do ms-email)
# ... outras propriedades
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=seu-email@gmail.com # <-- TROCAR AQUI
spring.mail.password=sua-senha-de-app # <-- TROCAR AQUI (senha de 16 dĂgitos sem espaços)
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
Você precisa iniciar os dois serviços. Abra dois terminais ou use a sua IDE.
-
Para iniciar o
ms-user
(porta 8081): Navegue até a pasta raiz doms-user
e execute:mvn spring-boot:run
-
Para iniciar o
ms-email
(porta 8082): Navegue até a pasta raiz doms-email
e execute:mvn spring-boot:run
Com os dois microsserviços rodando, use o Postman (ou similar) para enviar uma requisição de cadastro.
- Método:
POST
- URL:
http://localhost:8081/users
- Headers:
Content-Type: application/json
- Body (raw, JSON):
{
"name": "Seu Nome",
"email": "seu-email-de-destino@exemplo.com"
}
-
Resposta da API: Você receberá uma resposta
201 Created
com os dados do usuário salvo no banco, incluindo ouserId
gerado. -
Recebimento do E-mail: Em alguns segundos, você deverá receber um e-mail de boas-vindas no endereço que informou no JSON.
-
Verificação nos Bancos de Dados:
- Consulte a tabela
tb_users
no bancoms-user
. Um novo registro de usuário deve estar lá. - Consulte a tabela
tb_emails
no bancoms-email
. Um novo registro de log de e-mail deve estar lá comstatusEmail = 'SENT'
.
- Consulte a tabela
A estrutura de pacotes para ambos os microsserviços segue as melhores práticas do Spring Boot, separando as responsabilidades:
com.ms.user
├── configs // Configurações (ex: RabbitMQ)
├── controller // Controladores REST
├── dtos // Data Transfer Objects
├── models // Entidades JPA
├── producers // Classes que publicam mensagens no RabbitMQ
├── repositories // Repositórios Spring Data JPA
└── services // Lógica de negócio
com.ms.email
├── configs // Configurações (ex: RabbitMQ)
├── consumers // Classes que consomem mensagens do RabbitMQ
├── dtos // Data Transfer Objects
├── enums // Enumerações (ex: StatusEmail)
├── models // Entidades JPA
├── repositories // Repositórios Spring Data JPA
└── services // Lógica de negócio