Este projeto implementa um sistema de cadastro de produtos com controle de estoque, vendas e clientes utilizando uma arquitetura moderna de microserviços baseada em Java 21 e Spring Boot 3. Mais detalhes aqui
├── api-gateway # Ponto único de entrada (Spring Cloud Gateway)
├── discovery-service # Service Discovery com Eureka
├── configuration-server # Configuração centralizada com Spring Cloud Config
├── user-service # Serviço de autenticação e usuários
├── product-service # Serviço de gerenciamento de produtos e estoque
├── client-service # Serviço de gerenciamento de clientes
├── sale-service # Serviço de gerenciamento de vendas
└── notification-service # Serviço de notificações
- Java 21 - Aproveitando recursos como Virtual Threads
- Spring Boot 3 - Base para desenvolvimento dos microserviços
- Spring Cloud - Suite de ferramentas para sistemas distribuídos
- Spring Cloud Gateway - API Gateway
- Spring Cloud Netflix Eureka - Service Discovery
- Spring Cloud Config - Configuração centralizada
- PostgreSQL - Banco de dados relacional
- Docker - Containerização
- Maven - Gerenciamento de dependências
- Design inicial da arquitetura
- Implementação da infraestrutura básica (Config Server, Service Discovery, API Gateway)
- Implementação do Auth Service
- Implementação do Produto Service
- Implementação do Cliente Service
- Implementação do Venda Service
- Implementação da mensageria entre serviços
- Implementação do Notificação Service
- Deploy em ambiente de produção
Este documento define as regras de negócio para um sistema básico (MVP) de cadastro de produtos com controle de estoque, vendas e clientes. O sistema permitirá gerenciar produtos, clientes, estoque e vendas, com a restrição de que cada usuário só pode ver o que ele mesmo cadastrou.
erDiagram
USUARIO ||--o{ PRODUTO : cadastra
USUARIO ||--o{ CLIENTE : cadastra
USUARIO ||--o{ VENDA : realiza
PRODUTO ||--o{ ITEM_VENDA : contem
CLIENTE ||--|| VENDA : possui
VENDA ||--o{ ITEM_VENDA : contem
USUARIO {
int id PK
string nome
string email
string senha
datetime data_cadastro
boolean ativo
}
PRODUTO {
int id PK
int usuario_id
string nome
string descricao
decimal preco
int quantidade_estoque
string codigo
datetime data_cadastro
datetime data_atualizacao
boolean ativo
}
CLIENTE {
int id PK
int usuario_id
string nome
string email
string telefone
string documento
string endereco
datetime data_cadastro
datetime data_atualizacao
boolean ativo
}
VENDA {
int id PK
int usuario_id
int cliente_id
decimal valor_total
datetime data_venda
string status
string forma_pagamento
decimal desconto
string observacao
}
ITEM_VENDA {
int id PK
int venda_id
int produto_id
int quantidade
decimal preco_unitario
decimal subtotal
}
- Cada usuário deve ter credenciais únicas para acessar o sistema.
- Um usuário só pode visualizar e gerenciar os registros que ele mesmo cadastrou.
- O sistema deve registrar qual usuário cadastrou cada registro no sistema.
- Todo produto deve ter um nome, código único, preço e quantidade em estoque.
- O estoque do produto deve ser atualizado automaticamente após cada venda.
- Não deve ser permitido vender uma quantidade maior que a disponível em estoque.
- Um produto pode ser marcado como inativo, mas não pode ser excluído se estiver vinculado a alguma venda.
- Deve ser possível rastrear o histórico de atualizações de estoque.
- Todo cliente deve ter nome e pelo menos um contato (email ou telefone).
- O documento do cliente (CPF/CNPJ) deve ser único no sistema para cada usuário.
- Um cliente pode ser marcado como inativo, mas não excluído se possuir vendas vinculadas.
- Uma venda deve estar sempre associada a um cliente e a um usuário que a realizou.
- Uma venda deve conter pelo menos um item (produto).
- O valor total da venda deve ser calculado automaticamente com base nos itens adicionados.
- Ao finalizar uma venda, o estoque dos produtos deve ser atualizado automaticamente.
- Uma venda pode ter os seguintes status: "Em andamento", "Finalizada", "Cancelada".
- Uma venda finalizada não pode ser alterada, apenas cancelada.
- Ao cancelar uma venda, o estoque dos produtos deve ser restaurado.
- Cada item de venda deve estar associado a um produto e a uma venda.
- O preço unitário do item de venda deve ser o preço atual do produto no momento da venda.
- O subtotal do item deve ser calculado automaticamente (preço unitário × quantidade).
- Não é possível adicionar uma quantidade de itens maior que a disponível em estoque.
- Criar: Registrar um novo produto com informações básicas e estoque inicial.
- Ler: Listar todos os produtos cadastrados pelo usuário atual ou buscar detalhes de um produto específico.
- Atualizar: Modificar informações do produto, incluindo preço e quantidade em estoque.
- Desativar: Marcar um produto como inativo (soft delete).
- Criar: Registrar um novo cliente com informações de contato.
- Ler: Listar todos os clientes cadastrados pelo usuário atual ou buscar detalhes de um cliente específico.
- Atualizar: Modificar informações de contato ou endereço do cliente.
- Desativar: Marcar um cliente como inativo (soft delete).
- Criar: Iniciar uma nova venda para um cliente, adicionar itens e finalizar.
- Ler: Listar todas as vendas realizadas pelo usuário atual ou visualizar detalhes de uma venda específica.
- Atualizar: Modificar uma venda em andamento (adicionar/remover itens, alterar quantidades).
- Cancelar: Cancelar uma venda (deve restaurar o estoque).
- Listagem de produtos com estoque baixo.
- Vendas realizadas por período.
- Histórico de compras por cliente.
- Produtos mais vendidos.
- Toda operação crítica deve ser registrada em log.
- O sistema deve implementar validações para todas as regras de negócio descritas.
- Devem ser implementadas medidas de segurança para garantir que um usuário não acesse dados de outro usuário.
- O banco de dados deve garantir a integridade referencial entre as entidades.
- Usuário faz login no sistema.
- Cadastra produtos e define estoque inicial.
- Cadastra clientes.
- Cria uma nova venda:
- Seleciona um cliente.
- Adiciona produtos e quantidades.
- Finaliza a venda.
- O sistema atualiza automaticamente o estoque.
- O usuário pode consultar histórico de vendas e produtos.
- Implementar sistema de permissões mais granular.
- Adicionar gestão de fornecedores.
- Implementar sistema de alertas para estoque baixo.
- Desenvolver dashboard com indicadores de desempenho.
- Implementar funcionalidade de devoluções.
Este documento apresenta uma arquitetura baseada em microserviços para o sistema de cadastro de produtos, utilizando Java 21 e Spring Boot 3. A arquitetura foi projetada para ser escalável, resiliente e seguir os princípios modernos de desenvolvimento de software.
graph TB
Cliente[Cliente Web/Mobile]
ApiGateway[API Gateway]
DiscoveryService[Service Discovery \n Eureka]
ConfigServer[Config Server]
AuthService[Auth Service]
ProdutoService[Produto Service]
ClienteService[Cliente Service]
VendaService[Venda Service]
NotificacaoService[Notificacao Service]
ProdutoDB[(Produto DB)]
ClienteDB[(Cliente DB)]
VendaDB[(Venda DB)]
AuthDB[(Auth DB)]
MessageBroker{Message Broker \n RabbitMQ/Kafka}
Cliente --> ApiGateway
ApiGateway --> AuthService
ApiGateway --> ProdutoService
ApiGateway --> ClienteService
ApiGateway --> VendaService
AuthService --> AuthDB
ProdutoService --> ProdutoDB
ClienteService --> ClienteDB
VendaService --> VendaDB
ProdutoService --> MessageBroker
ClienteService --> MessageBroker
VendaService --> MessageBroker
MessageBroker --> NotificacaoService
AuthService -.-> DiscoveryService
ProdutoService -.-> DiscoveryService
ClienteService -.-> DiscoveryService
VendaService -.-> DiscoveryService
NotificacaoService -.-> DiscoveryService
ApiGateway -.-> DiscoveryService
AuthService -.-> ConfigServer
ProdutoService -.-> ConfigServer
ClienteService -.-> ConfigServer
VendaService -.-> ConfigServer
NotificacaoService -.-> ConfigServer
ApiGateway -.-> ConfigServer
classDef service fill:#C5E1A5,stroke:#33691E,stroke-width:2px;
classDef database fill:#B3E5FC,stroke:#01579B,stroke-width:2px;
classDef infrastructure fill:#FFE0B2,stroke:#E65100,stroke-width:2px;
classDef client fill:#E1BEE7,stroke:#4A148C,stroke-width:2px;
classDef messagebroker fill:#FFCCBC,stroke:#BF360C,stroke-width:2px;
class AuthService,ProdutoService,ClienteService,VendaService,NotificacaoService service;
class ProdutoDB,ClienteDB,VendaDB,AuthDB database;
class ApiGateway,DiscoveryService,ConfigServer infrastructure;
class Cliente client;
class MessageBroker messagebroker;
-
Função: Ponto único de entrada para o sistema
-
Responsabilidades
:
- Roteamento de requisições para os serviços apropriados
- Autenticação e autorização via JWT
- Rate limiting e circuit breaker
- Balanceamento de carga
-
Função: Registro e descoberta de serviços
-
Responsabilidades
:
- Gerenciar localização dinâmica de serviços
- Facilitar a comunicação entre serviços
- Balanceamento de carga na camada de cliente
-
Função: Centralização de configurações
-
Responsabilidades
:
- Gerenciar configurações externalizadas
- Permitir atualizações em tempo real
- Separar configurações por ambiente (dev, test, prod)
-
Função: Comunicação assíncrona entre serviços
-
Responsabilidades
:
- Implementar padrão publish-subscribe
- Garantir entrega de mensagens
- Desacoplar serviços
-
Domínio: Autenticação e autorização
-
Responsabilidades
:
- Registro e gestão de usuários
- Autenticação via JWT
- Controle de acesso baseado em perfis
- Integração com Auth DB (PostgreSQL)
-
Domínio: Gestão de produtos e estoque
-
Responsabilidades
:
- CRUD de produtos
- Controle de estoque
- Validações de negócio específicas para produtos
- Integração com Produto DB (PostgreSQL)
- Publicação de eventos de produto (criação, atualização, mudança de estoque)
-
Domínio: Gestão de clientes
-
Responsabilidades
:
- CRUD de clientes
- Validações de negócio específicas para clientes
- Integração com Cliente DB (PostgreSQL)
- Publicação de eventos de cliente (criação, atualização)
-
Domínio: Gestão de vendas
-
Responsabilidades
:
- CRUD de vendas e itens de venda
- Processamento de vendas
- Validações de negócio específicas para vendas
- Integração com Venda DB (PostgreSQL)
- Consultas ao Produto Service para verificar estoque
- Consultas ao Cliente Service para validar cliente
- Publicação de eventos de venda (criação, finalização, cancelamento)
-
Domínio: Envio de notificações
-
Responsabilidades
:
- Processamento de eventos de outros serviços
- Envio de notificações por email, SMS, etc.
- Geração de relatórios
Cada microserviço terá seu próprio banco de dados (Database per Service pattern):
- Auth DB: Armazena dados de usuários e permissões
- Produto DB: Armazena dados de produtos e estoque
- Cliente DB: Armazena dados de clientes
- Venda DB: Armazena dados de vendas e itens de venda
Recomendação: PostgreSQL para todos os serviços, facilitando a manutenção.
Como cada serviço tem seu próprio banco de dados isolado, não é possível usar chaves estrangeiras tradicionais entre serviços. As seguintes estratégias serão implementadas para gerenciar relacionamentos:
- Serviços armazenam apenas os IDs de entidades gerenciadas por outros serviços
- Exemplo: Venda Service armazena
cliente_id
sem chave estrangeira formal
- Cópia estratégica de dados que raramente mudam para reduzir chamadas entre serviços
- Exemplo: Venda Service armazena
cliente_id
,cliente_nome
ecliente_documento
no momento da venda
- Quando dados duplicados são atualizados em seu serviço de origem, um evento é publicado
- Serviços que contêm cópias desses dados consomem o evento e atualizam suas cópias
- Exemplo: Quando um cliente muda seu nome no Cliente Service, um evento "Cliente Atualizado" é publicado para que o Venda Service possa atualizar os registros relevantes
USUARIO {
id (PK)
nome
email
senha (hash)
data_cadastro
ativo
}
PERFIL {
id (PK)
nome
descricao
}
USUARIO_PERFIL {
usuario_id (PK)
perfil_id (PK)
}
PRODUTO {
id (PK)
usuario_id
nome
descricao
preco
quantidade_estoque
codigo
data_cadastro
data_atualizacao
ativo
}
MOVIMENTO_ESTOQUE {
id (PK)
produto_id (FK)
quantidade
tipo (entrada/saída)
motivo
referencia_id (id da venda ou outra operação)
data_movimento
}
CLIENTE {
id (PK)
usuario_id
nome
email
telefone
documento
endereco
data_cadastro
data_atualizacao
ativo
}
VENDA {
id (PK)
usuario_id
cliente_id (referência, não FK)
cliente_nome
cliente_documento
valor_total
data_venda
status
forma_pagamento
desconto
observacao
}
ITEM_VENDA {
id (PK)
venda_id (FK)
produto_id (referência, não FK)
produto_nome
produto_codigo
quantidade
preco_unitario (no momento da venda)
subtotal
}
- Entre cliente (frontend) e API Gateway
- Entre API Gateway e microserviços
- Entre microserviços quando necessária resposta imediata
- Usada principalmente para consultas e validações: verificar disponibilidade de estoque, validar cliente
- Entre microserviços para operações que não necessitam de resposta imediata
- Para propagação de eventos (Event-Driven Architecture)
- Para operações de longa duração
- Usada principalmente para atualizações de estado: redução de estoque, atualização de dados duplicados
Para manter a consistência em operações que envolvem múltiplos serviços (como criar uma venda), será implementado o padrão SAGA:
sequenceDiagram
participant Cliente as Cliente Web/Mobile
participant Gateway as API Gateway
participant VS as Venda Service
participant CS as Cliente Service
participant PS as Produto Service
participant MB as Message Broker
Cliente->>Gateway: Criar Venda
Gateway->>VS: Encaminha requisição
VS->>CS: Valida cliente (REST)
CS-->>VS: Cliente válido + dados básicos
loop Para cada produto
VS->>PS: Verifica disponibilidade (REST)
PS-->>VS: Confirma disponibilidade + dados do produto
end
VS->>VS: Registra venda no banco
VS-->>Gateway: Venda criada com sucesso
Gateway-->>Cliente: Venda criada com sucesso
VS->>MB: Publica evento "Venda Criada"
MB->>PS: Notifica sobre venda
PS->>PS: Reduz estoque
PS->>MB: Publica "Estoque Atualizado"
alt Falha ao reduzir estoque
PS->>MB: Publica "Falha ao Atualizar Estoque"
MB->>VS: Notifica falha
VS->>VS: Cancela venda (compensação)
VS->>MB: Publica "Venda Cancelada"
end
O sistema adota o princípio de consistência eventual:
- Os dados podem ficar temporariamente inconsistentes entre serviços
- Mecanismos de sincronização garantem que eventualmente os dados fiquem consistentes
- Cada serviço é responsável por sua própria consistência interna
- Venda Service recebe requisição para criar venda
- Valida cliente via Cliente Service (síncrono via REST)
- Recupera e armazena informações básicas do cliente (nome, documento)
- Para cada produto:
- Verifica disponibilidade via Produto Service (síncrono via REST)
- Armazena informações do produto necessárias (nome, código, preço)
- Cria a venda no banco de dados local
- Publica evento "Venda Criada" via Message Broker
- Produto Service consome evento e atualiza estoque
- Cliente Service atualiza dados de um cliente
- Publica evento "Cliente Atualizado" com ID e dados alterados
- Venda Service consome o evento
- Atualiza dados duplicados nas vendas relevantes
- JWT (JSON Web Token) para autenticação entre cliente e API Gateway
- OAuth 2.0 para autorização
- Comunicação segura entre serviços
- RBAC (Role-Based Access Control)
- Cada usuário só pode acessar recursos que ele mesmo criou
- TLS/SSL para todas as comunicações
- Secrets gerenciados pelo Config Server
- Java 21: Aproveitando features como Virtual Threads e Estruturas de Dados Imutáveis
- Spring Boot 3: Base para desenvolvimento dos microserviços
- Spring Cloud: Para componentes de infraestrutura
- Maven/Gradle: Gerenciamento de dependências
- Docker: Containerização
- Kubernetes: Orquestração (opcional para MVP)
- Domain-Driven Design (DDD): Para modelar domínios complexos
- CQRS (Command Query Responsibility Segregation): Para serviços com operações de leitura intensivas
- Event Sourcing: Para manter histórico de alterações em entidades críticas
- API First: Definir APIs antes da implementação
- Distributed Tracing: Spring Cloud Sleuth + Zipkin
- Métricas: Prometheus + Grafana
- Logs Centralizados: ELK Stack (Elasticsearch, Logstash, Kibana)
Para facilitar a transição para microserviços, recomenda-se uma abordagem gradual:
- Configurar ambiente de desenvolvimento com Docker
- Implementar Config Server e Service Discovery
- Implementar API Gateway básico
- Implementar Auth Service
- Implementar um dos serviços de domínio (ex: Produto Service)
- Integrar com API Gateway
- Implementar demais serviços de domínio
- Estabelecer comunicação entre serviços
- Implementar Message Broker
- Refatorar comunicação para padrão Event-Driven
- Implementar Notificação Service
- Implementar monitoramento e tracing
- Otimizar performance e resiliência
- Desafio: Manter a integridade referencial entre entidades em diferentes serviços sem chaves estrangeiras
- Solução: Implementar referências por ID, redundância controlada e sincronização via eventos
- Desafio: Manter dados consistentes em uma arquitetura distribuída
- Solução: Implementar padrão SAGA para transações distribuídas, aceitar consistência eventual, implementar mecanismos de compensação
- Desafio: Lidar com falhas parciais no sistema
- Solução: Implementar circuit breakers, rate limiting, retries, e mecanismos de fallback
- Desafio: Rastrear transações que passam por múltiplos serviços
- Solução: Implementar correlation IDs e distributed tracing (Spring Cloud Sleuth + Zipkin)
- Desafio: Testar efetivamente um sistema distribuído
- Solução: Múltiplas estratégias de teste (unitário, integração, contrato, end-to-end), utilizar Contract Testing (Spring Cloud Contract)
- Desafio: Equipe precisa aprender novas tecnologias e padrões
- Solução: Implementação gradual, documentação clara, treinamentos, começar com serviços menos críticos
- Desafio: Operar e dar suporte a múltiplos serviços independentes
- Solução: Automação de DevOps, monitoramento centralizado, infraestrutura como código
- Desafio: Aumento de comunicação de rede e possíveis gargalos
- Solução: Uso estratégico de caches, redundância controlada de dados, otimização de APIs
- Desafio: Manter consistência nas interfaces entre serviços
- Solução: Documentação de APIs (Swagger/OpenAPI), versionamento de APIs, contratos de serviço
- Adoção Incremental: Iniciar com 2-3 serviços e expandir gradualmente
- Monitoramento Avançado: Implementar desde o início para detectar problemas rapidamente
- API Gateway Robusto: Investir em um gateway que facilite políticas de segurança e roteamento
- Documentação Detalhada: Manter documentação atualizada de cada serviço e suas APIs
- Automação de Testes: Implementar pipelines CI/CD com testes automatizados
- Padrões Consistentes: Utilizar padrões de projeto e implementação consistentes entre serviços
A arquitetura proposta segue os princípios modernos de microserviços, utilizando Java 21 e Spring Boot 3 como base tecnológica. A abordagem gradual de implementação permite uma transição suave para este paradigma, minimizando riscos e maximizando o aprendizado da equipe.
Este documento serve como um guia inicial e deve ser revisado e refinado conforme o projeto evolui e novos requisitos são identificados.