Este projeto demonstra uma arquitetura de microserviços moderna com:
- 2 Microserviços: Serviço de Usuário (8081) e Serviço de Pedidos (8082)
- Autentiçação JWT: Spring Security + JWT para proteção dos endpoints de ambos os serviços
- Comunicação entre Serviços: OpenFeign para validação síncrona de usuários ao criar pedidos
- Criptografia AES-256-GCM: Dados sensíveis criptografados
- Cache Redis: Performance otimizada com serialização LocalDateTime
- Eventos MongoDB: Auditoria completa
- GlobalExceptionHandler: Tratamento de erros estruturado (JSON)
- Logs estruturados: Logback + Logstash (ELK Stack)
- Documentação API: Swagger/OpenAPI
- CI/CD: GitHub Actions com build e testes automatizados
- Testes Unitários: JUnit 5 e Mockito
┌─────────────────┐ ┌─────────────────┐
│ Serviço Usuário │ │ Serviço Pedidos │
│ (8081) │ │ (8082) │
└────────┬────────┘ └────────┬────────┘
│ │
├───────────┬───────────┤
│ │ │
┌────▼────┐ ┌───▼───┐ ┌────▼─────┐
│PostgreSQL│ │ Redis │ │ MongoDB │
└─────────┘ └───────┘ └──────────┘
│ │ │
└───────────┴───────────┘
│
┌───────────┴───────────┐
│ │
┌────▼────┐ ┌────▼────┐
│ ELK │ │ Jaeger │
│ Stack │ │ + OTel │
└─────────┘ └─────────┘
Backend
- Java 21, Spring Boot 3.2.2
- Spring Security, JWT (JJWT 0.12.3)
- Spring Cloud OpenFeign (comunicação entre serviços)
- JPA/Hibernate, Flyway
Infra & Observabilidade
- Docker, Docker Compose
- PostgreSQL, Redis, MongoDB
- ELK Stack (Elasticsearch, Logstash, Kibana)
- Jaeger + OpenTelemetry
DevOps
- GitHub Actions (CI/CD)
Qualidade
- JUnit 5, Mockito
- Swagger/OpenAPI
- Docker e Docker Compose
- Java 21 (para desenvolvimento local)
- Maven 3.9+ (para build local)
git clone https://github.com/efernandalima/microservice.git
cd microservice
cd infra
docker-compose up -dIsso irá iniciar:
- PostgreSQL (porta 5432)
- Redis (porta 6379)
- MongoDB (porta 27017)
- Elasticsearch (porta 9200)
- Kibana (porta 5601)
- Logstash (porta 5000)
- Jaeger UI (porta 16686)
- Serviço de Usuário (porta 8081)
- Serviço de Pedidos (porta 8082)
docker-compose pscurl http://localhost:8081/health
curl http://localhost:8082/healthSe preferir rodar os serviços localmente com Maven:
# Terminal 1 - Subir apenas infraestrutura
cd infra
docker-compose up -d postgres redis mongodb
# Terminal 2 - Rodar servico-usuario
mvn spring-boot:run -pl servico-usuario
# Terminal 3 - Rodar servico-pedido
mvn spring-boot:run -pl servico-pedido- Serviço de Usuário: http://localhost:8081/swagger-ui.html
- Serviço de Pedidos: http://localhost:8082/swagger-ui.html
- Serviço de Usuário: http://localhost:8081/api-docs
- Serviço de Pedidos: http://localhost:8082/api-docs
Os campos sensíveis (CPF, email, telefone) são criptografados usando AES-256-GCM antes de serem salvos no banco de dados.
A chave padrão é apenas para desenvolvimento. Para produção, gere uma chave segura:
# Gerar chave de 256 bits em Base64
openssl rand -base64 32Configure a variável de ambiente:
export ENCRYPTION_KEY=sua_chave_aquiOu edite o docker-compose.yml:
environment:
- ENCRYPTION_KEY=sua_chave_aquicurl -X POST http://localhost:8081/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"username": "joao",
"email": "joao@example.com",
"password": "senha123"
}'
# Resposta: { "accessToken": "eyJ...", "tokenType": "Bearer", ... }curl -X POST http://localhost:8081/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "joao", "password": "senha123"}'TOKEN="seu_token_jwt_aqui"
curl -X POST http://localhost:8081/api/usuarios \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"nome": "João da Silva",
"cpf": "12345678901",
"email": "joao@example.com",
"telefone": "11987654321"
}'curl -X POST http://localhost:8082/api/pedidos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"usuarioId": 1,
"nomeProduto": "Notebook Dell",
"quantidade": 2,
"precoTotal": 2500.00,
"status": "PENDENTE"
}'
# O servico-pedido consulta automaticamente o servico-usuario
# para validar se o usuarioId existe antes de criar o pedido.
# Se o usuario nao existir, retorna 400 Bad Request.# Requisição inválida - retorna JSON estruturado
curl -X POST http://localhost:8081/api/usuarios \
-H "Content-Type: application/json" \
-d '{}'
# Resposta esperada:
# {
# "timestamp": "2026-02-04T23:30:00",
# "status": 400,
# "error": "Validation Error",
# "message": "Erro de validação nos campos",
# "fieldErrors": [...]
# }- Acesse: http://localhost:5601
- Vá em Management → Stack Management → Index Patterns
- Crie um index pattern:
microservices-logs-* - Vá em Discover para visualizar os logs
- Acesse: http://localhost:16686
- Selecione o serviço:
servico-usuarioouservico-pedido - Clique em Find Traces
docker exec -it redis redis-cli
KEYS *
GET usuarios::1docker exec -it mongodb mongosh
use events
db.usuarioEvents.find().pretty()
db.pedidoEvents.find().pretty()docker exec -it postgres psql -U postgres -d usuariodb
SELECT id, nome, cpf, email FROM usuarios;Os campos cpf, email e telefone aparecerão como strings Base64 criptografadas.
Endpoints Principais:
- Serviço Usuário: http://localhost:8081
- Serviço Pedidos: http://localhost:8082
- Kibana: http://localhost:5601
- Jaeger: http://localhost:16686
cd infra
docker-compose downdocker-compose logs -f servico-usuario
docker-compose logs -f servico-pedidodocker-compose up -d --build servico-usuariodocker-compose down -vmicroservice/
├── pom.xml # POM raiz
├── servico-usuario/ # Microserviço de Usuário
│ ├── src/main/java/
│ │ └── lab/microservices/usuario/
│ │ ├── domain/ # Entidades JPA
│ │ ├── repository/ # Repositories
│ │ ├── service/ # Lógica de negócio
│ │ ├── api/ # Controllers REST
│ │ │ └── dto/ # DTOs
│ │ ├── events/ # Eventos MongoDB
│ │ └── crypto/ # Criptografia AES
│ ├── src/main/resources/
│ │ ├── application.yml
│ │ ├── logback-spring.xml
│ │ └── db/migration/ # Flyway migrations
│ ├── Dockerfile
│ └── pom.xml
├── servico-pedido/ # Microserviço de Pedidos
│ └── (mesma estrutura)
└── infra/ # Infraestrutura
├── docker-compose.yml
├── postgres/
│ └── init-multiple-dbs.sh
├── logstash/pipeline/
│ └── logstash.conf
└── otel/
└── otel-collector.yaml
Cada serviço possui um handler global que captura exceções e retorna respostas JSON estruturadas:
MethodArgumentNotValidException→ 400 Bad Request com lista de errosIllegalArgumentException→ 400 Bad RequestException→ 500 Internal Server Error (sem expor stack trace)
Configuração customizada do Redis cache com:
- Serialização JSON para suporte a
LocalDateTime - TTL de 10 minutos por padrão
- Não cacheia valores nulos
# Verifique logs
docker-compose logs
# Verifique se as portas estão disponíveis
netstat -an | findstr "8081 8082 5432 6379 27017"# Aguarde o PostgreSQL inicializar completamente
docker-compose logs postgres
# Reinicie os serviços de aplicação
docker-compose restart servico-usuario servico-pedido# Aumentar vm.max_map_count (Linux/WSL)
sudo sysctl -w vm.max_map_count=262144- Comunicação entre microserviços
- Segurança com JWT
- Cache com Redis
- Observabilidade com logs e tracing
- Tratamento global de exceções
- Boas práticas de arquitetura backend
Este projeto é de caráter educacional e demonstrativo, criado para fins de estudo e portfólio.
Desenvolvido por Fernanda Lima como projeto de estudo e portfólio em arquitetura de microserviços.