Plataforma backend de pedidos e entregas em tempo real, construída como monorepo Java 21/Spring Boot 3 para demonstrar arquitetura event-driven, microsserviços, Outbox Pattern, idempotência, Saga coreografada, CQRS parcial, LocalStack/AWS e infraestrutura como código.
O sistema simula um fluxo de e-commerce/logística em alta escala:
order-servicerecebe o pedido e persisteOrderCreatedno outbox.- O publisher assíncrono publica o evento em SNS.
inventory-servicereserva estoque via SQS.payment-serviceprocessa pagamento.order-serviceconfirma ou cancela o pedido conforme o resultado.fulfillment-serviceinicia separação e publica pacote pronto.delivery-servicecria tracking e conclui entrega simulada.notification-servicesimula notificação.tracking-query-servicemantém uma projeção otimizada de leitura.
O projeto usa:
- Java 21 e Spring Boot 3.x.
- Maven multi-module.
- PostgreSQL para os serviços relacionais.
- Flyway para migrations.
- SNS/SQS via AWS SDK v2, com LocalStack para execução local.
- Outbox Pattern no
order-service. - Consumers idempotentes com tabela
processed_eventsnos serviços persistentes. - Saga coreografada por eventos.
- CQRS parcial via
tracking-query-service. - Resilience4j no simulador de pagamento.
- Micrometer/Actuator para health, métricas e Prometheus.
- Terraform modular para AWS dev.
- GitHub Actions para CI, plan e CD dev.
services/
common-events/
order-service/
inventory-service/
payment-service/
fulfillment-service/
delivery-service/
notification-service/
tracking-query-service/
docs/architecture/
infra/terraform/
localstack/
scripts/
order-service: API de pedidos, agregado de domínio, outbox, consumo de resultados de inventário, pagamento e entrega.inventory-service: estoque, reserva transacional com lock, liberação por compensação.payment-service: simulação de pagamento idempotente, regra de alto valor configurável.fulfillment-service: separação/picking simulada.delivery-service: criação e atualização de tracking de entrega.notification-service: simulação de e-mail/SMS/push por evento.tracking-query-service: projeção consolidada para leitura rápida.
POST /orders
GET /orders/{orderId}
POST /orders/{orderId}/cancel
POST /products/{productId}/stock
GET /products/{productId}/stock
GET /tracking/orders/{orderId}Exemplo de criação:
curl -X POST http://localhost:8081/orders \
-H "Content-Type: application/json" \
-d '{
"customerId": "cst-123",
"paymentMethod": "CREDIT_CARD",
"items": [
{"productId": "prd-001", "quantity": 2, "unitPrice": 99.90}
]
}'Pré-requisitos:
- Docker e Docker Compose.
- Java 21 para execução fora de containers.
- Maven 3.9+.
Suba a stack:
docker compose up --buildCarregue estoque antes de criar pedidos:
curl -X POST http://localhost:8082/products/prd-001/stock \
-H "Content-Type: application/json" \
-d '{"quantity": 100}'Consulte tracking:
curl http://localhost:8087/tracking/orders/{orderId}mvn verifyPara rodar também os testes de integração com Testcontainers:
mvn verify -Pintegration-testsO projeto inclui exemplos de:
- Testes unitários de domínio.
- Testes de arquitetura com ArchUnit.
- Estrutura para integração com PostgreSQL/Testcontainers.
- Estrutura para mensageria LocalStack/Testcontainers.
localstack/init-aws.sh roda automaticamente no docker compose up e cria:
- Tópicos SNS por domínio.
- Filas SQS principais.
- DLQs para cada fila.
- Assinaturas filtradas por atributo
eventType. - Tabelas DynamoDB para tracking, idempotência de pagamento e tentativas de notificação.
- Bucket S3 de artefatos.
- Repositórios ECR locais.
- Log groups CloudWatch Logs.
- Secrets locais para JWT, notificação e bancos PostgreSQL.
O Terraform em infra/terraform/environments/dev provisiona:
- VPC pública/privada.
- Repositórios ECR.
- Tópicos SNS.
- Filas SQS com DLQ, policies e subscriptions SNS filtradas por evento.
- DynamoDB tables.
- Aurora PostgreSQL Serverless v2.
- ElastiCache Redis.
- Log groups CloudWatch.
- Roles IAM de execução e runtime ECS.
- ECS Cluster.
- ECS Task Definitions e ECS Services Fargate para todos os microsserviços.
- ALB para APIs HTTP.
- API Gateway HTTP apontando para o ALB.
- Secrets Manager para JWT e provider de notificação.
Exemplo:
cd infra/terraform/environments/dev
terraform init
terraform plan -var image_tag=latest- Eventos usam envelope comum com
eventId,eventType,aggregateId,aggregateType,occurredAt,versionepayload. - O
order-serviceusa outbox para não publicar eventos antes do commit do pedido. - Consumers persistentes usam
processed_eventspara idempotência. - A compensação de pagamento recusado é coreografada:
PaymentRejectedlibera estoque e cancela pedido. - O read model de tracking é separado do modelo transacional.
- DynamoDB foi preparado, mas a primeira versão usa PostgreSQL no tracking para manter o ambiente local mais simples.
- Fulfillment, delivery e notification usam idempotência em memória nesta base inicial; produção deve persistir esse controle.
- Terraform dev provisiona a stack AWS completa para desenvolvimento, com defaults conservadores de capacidade.
- Segurança JWT está preparada como tópico de evolução; a primeira versão foca no fluxo backend/event-driven.
- Persistir idempotência nos serviços sem banco.
- Adicionar Spring Security/JWT local.
- Migrar tracking para DynamoDB.
- Endurecer ECS, ALB/API Gateway e Aurora para produção multi-AZ com WAF e alarmes.
- Adicionar tracing OpenTelemetry end-to-end.
- Adicionar contratos de eventos e testes de compatibilidade.
- Criar smoke tests pós-deploy.