Projeto Microsserviços de Pedidos - Backend com Spring Boot
1. Descrição
O Microsserviços de Pedidos é um sistema distribuído desenvolvido com Java e Spring Boot, composto por três microsserviços independentes que se comunicam de forma assíncrona via RabbitMQ. Cada serviço possui sua própria responsabilidade, banco de dados e ciclo de vida, seguindo os princípios de arquitetura de microsserviços.
Este projeto foi desenvolvido com fins de estudo e prática de conceitos como mensageria, autenticação JWT, segurança com Spring Security e comunicação assíncrona entre serviços.
2. Arquitetura
graph TD
Cliente -->|HTTP + JWT| OS[Order Service :8082]
Cliente -->|HTTP| AS[Auth Service :8081]
AS -->|Gera JWT| Cliente
OS -->|Publica evento| RMQ[RabbitMQ :5672]
RMQ -->|Consome evento| NS[Notification Service :8083]
AS --> DB1[(db_auth)]
OS --> DB2[(db_orders)]
NS --> DB3[(db_notifications)]
3. Microsserviços
3.1. Auth Service — porta 8081
Responsável pelo cadastro de usuários, autenticação e emissão de tokens JWT. É o ponto de entrada para qualquer cliente que precise se autenticar no sistema.
Principais funcionalidades:
- Cadastro de usuários com roles (
ROLE_ADMIN, ROLE_USER, ROLE_MODERATOR)
- Login com validação de credenciais via Spring Security
- Geração e validação de tokens JWT
- Gerenciamento de usuários (CRUD)
Endpoints principais:
| Método | Endpoint | Descrição | Auth |
|---|
| POST | /api/auth/login | Realiza login e retorna o token JWT | ❌ |
| POST | /usuarios | Cadastra um novo usuário | ❌ |
| GET | /usuarios | Lista todos os usuários | ✅ |
| GET | /usuarios/{id} | Busca usuário por ID | ✅ |
| PUT | /usuarios/{id} | Atualiza dados do usuário | ✅ ADMIN |
| DELETE | /usuarios/{id} | Remove um usuário | ✅ ADMIN |
3.2. Order Service — porta 8082
Responsável pelo gerenciamento de pedidos. Valida o token JWT emitido pelo Auth Service e publica eventos no RabbitMQ sempre que um pedido é criado ou atualizado.
Principais funcionalidades:
- CRUD de pedidos com proteção por JWT
- Publicação de eventos
PedidoCriadoEvent e PedidoAtualizadoEvent no RabbitMQ
- Filtragem de pedidos por criador
Endpoints principais:
| Método | Endpoint | Descrição | Auth |
|---|
| GET | /pedidos | Lista todos os pedidos | ✅ |
| GET | /pedidos/{id} | Busca pedido por ID | ✅ |
| GET | /pedidos/criador/{criador} | Lista pedidos por criador | ✅ |
| POST | /pedidos | Cria um novo pedido | ✅ |
| PUT | /pedidos | Atualiza um pedido | ✅ |
| DELETE | /pedidos/{id} | Remove um pedido | ✅ |
3.3. Notification Service — porta 8083
Responsável por consumir os eventos publicados pelo Order Service no RabbitMQ e registrar notificações no banco de dados. Não expõe endpoints de escrita — apenas consome eventos e disponibiliza consultas.
Principais funcionalidades:
- Consumo de
PedidoCriadoEvent e PedidoAtualizadoEvent via RabbitMQ
- Registro de notificações com tipo (
PEDIDO_CRIADO, PEDIDO_ATUALIZADO) e status (PROCESSADA, FALHA)
- Consulta de notificações por destinatário
Endpoints principais:
| Método | Endpoint | Descrição | Auth |
|---|
| GET | /notificacoes | Lista todas as notificações | ✅ |
| GET | /notificacoes/{id} | Busca notificação por ID | ✅ |
| GET | /notificacoes/destinatario/{dest} | Lista por destinatário | ✅ |
4. Diagrama de Classes
classDiagram
class Usuario {
- id : Long
- nome : String
- usuario : String
- senha : String
- foto : String
- role : Role
- ativo : Boolean
- criadoEm : LocalDateTime
- atualizadoEm : LocalDateTime
}
class Pedido {
- id : Long
- produto : String
- quantidade : Integer
- status : String
- criadoPor : String
- criadoEm : LocalDateTime
}
class Notificacao {
- id : Long
- pedidoId : Long
- destinatario : String
- mensagem : String
- tipo : TipoNotificacao
- status : StatusNotificacao
- criadoEm : LocalDateTime
}
class Role {
<<enumeration>>
ROLE_ADMIN
ROLE_USER
ROLE_MODERATOR
}
class TipoNotificacao {
<<enumeration>>
PEDIDO_CRIADO
PEDIDO_ATUALIZADO
}
class StatusNotificacao {
<<enumeration>>
RECEBIDA
PROCESSADA
FALHA
}
Usuario --> Role
Notificacao --> TipoNotificacao
Notificacao --> StatusNotificacao
5. Diagrama Entidade-Relacionamento
erDiagram
tb_usuarios {
bigint id PK
varchar(100) nome
varchar(150) usuario
varchar(255) senha
varchar(500) foto
varchar(30) role
boolean ativo
datetime criado_em
datetime atualizado_em
}
tb_pedidos {
bigint id PK
varchar(255) produto
int quantidade
varchar(255) status
varchar(255) criado_por
datetime criado_em
}
tb_notificacoes {
bigint id PK
bigint pedido_id
varchar(150) destinatario
varchar(500) mensagem
varchar(30) tipo
varchar(20) status
datetime criado_em
}
6. Fluxo de Comunicação
sequenceDiagram
participant C as Cliente
participant AS as Auth Service
participant OS as Order Service
participant RMQ as RabbitMQ
participant NS as Notification Service
C->>AS: POST /api/auth/login
AS-->>C: { token: "eyJ..." }
C->>OS: POST /pedidos (Bearer token)
OS->>OS: Valida JWT
OS->>OS: Salva pedido no banco
OS->>RMQ: Publica PedidoCriadoEvent
OS-->>C: 201 Created
RMQ->>NS: Entrega PedidoCriadoEvent
NS->>NS: Salva notificação no banco
7. Tecnologias Utilizadas
| Item | Descrição |
|---|
| Linguagem | Java 21 |
| Framework | Spring Boot 4.0.6 |
| Segurança | Spring Security + JWT (jjwt 0.12.5) |
| Mensageria | RabbitMQ 3.13 |
| ORM | Spring Data JPA + Hibernate |
| Banco de dados | MySQL 8.0 |
| Servidor | Tomcat (embutido) |
| Containerização | Docker + Docker Compose |
8. Requisitos
9. Como Executar
9.1. Subindo o RabbitMQ
Na raiz do projeto, execute:
docker compose up -d
Acesse o painel de gerenciamento em http://localhost:15672 com as credenciais configuradas no docker-compose.yml.
9.2. Configurando o banco de dados
Crie os databases no MySQL:
CREATE DATABASE db_auth;
CREATE DATABASE db_orders;
CREATE DATABASE db_notifications;
9.3. Executando os serviços
Abra um terminal para cada serviço e execute na seguinte ordem:
# Terminal 1 — Auth Service
cd auth-service
mvn spring-boot:run
# Terminal 2 — Order Service
cd order-service
mvn spring-boot:run
# Terminal 3 — Notification Service
cd notification-service
mvn spring-boot:run
9.4. Testando o fluxo completo
# 1. Login
curl -s -X POST http://localhost:8081/usuarios/logar \
-H "Content-Type: application/json" \
-d '{"usuario":"seu@email.com","senha":"senha123"}'
# 2. Criar pedido (substitua <TOKEN> pelo token retornado)
curl -s -X POST http://localhost:8082/pedidos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <TOKEN>" \
-d '{"produto":"Notebook","quantidade":2}'
# 3. Verificar notificação gerada
curl -s http://localhost:8083/notificacoes
10. Estrutura do Projeto
microservicos-pedidos/
├── docker-compose.yml
├── auth-service/
│ ├── src/main/java/com/rfl/auth_service/
│ │ ├── config/
│ │ ├── controller/
│ │ ├── dto/
│ │ ├── enums/
│ │ ├── exception/
│ │ ├── model/
│ │ ├── repository/
│ │ ├── security/
│ │ └── service/
│ └── src/main/resources/application.properties
├── order-service/
│ ├── src/main/java/com/rfl/order_service/
│ │ ├── config/
│ │ ├── controller/
│ │ ├── dto/
│ │ ├── event/
│ │ ├── exception/
│ │ ├── model/
│ │ ├── repository/
│ │ ├── security/
│ │ └── service/
│ └── src/main/resources/application.properties
└── notification-service/
├── src/main/java/com/rfl/notification_service/
│ ├── config/
│ ├── consumer/
│ ├── controller/
│ ├── dto/
│ ├── enums/
│ ├── event/
│ ├── exception/
│ ├── model/
│ ├── repository/
│ └── service/
└── src/main/resources/application.properties
11. Contribuição
Este repositório é parte de um projeto de estudos, mas contribuições são bem-vindas! Caso tenha sugestões, correções ou melhorias, fique à vontade para:
- Criar uma issue
- Enviar um pull request
12. Contato
Para dúvidas, sugestões ou colaborações, abra uma issue no repositório.