Received Bank

Recebimentos bancários em microsserviços, eventos e consistência transacional.

Sistema distribuído construído com Java 21 e Spring Boot para emissão, consulta, pagamento e notificação de boletos. O projeto aplica DDD, Arquitetura Hexagonal, CQRS e Transactional Outbox em um domínio financeiro com infraestrutura local e desenho de solução em AWS.

Java 21 Spring Boot 3.2 Kafka / Redpanda PostgreSQL 16 Redis 7 AWS EKS Terraform GitHub Actions
4 microsserviços de domínio
CQRS escrita e leitura separadas
Outbox evento e banco na mesma transação
AWS EKS, MSK, SQS, RDS e Redis

Visão Geral

O Received Bank organiza o domínio de recebimentos em serviços independentes e integrados por eventos. A escrita de boletos fica isolada do read model de consulta, o pagamento vem de um PSP/Banco externo e notificações reagem aos eventos publicados.

Domínio financeiro

Fluxo completo de boleto: emissão pelo PJ Parceiro, pagamento pelo Cliente Pagador, consulta e notificação.

Consistência sem dual write

O boleto e o evento boleto.gerado são gravados na mesma transação PostgreSQL.

Read model dedicado

O query-service mantém consultas otimizadas sem ler o banco do serviço de escrita.

Operação cloud-ready

Arquitetura AWS com EKS, MSK, SQS, RDS, ElastiCache, WAF, S3 e SNS/SES.

Stack Técnica

A base do projeto combina runtime moderno, mensageria, persistência relacional, cache de idempotência, infraestrutura como código e pipelines de validação.

CamadaTecnologias
Linguagem e runtimeJava 21, Spring Boot 3.2, Spring Cloud
MensageriaApache Kafka via Redpanda em ambiente local e Amazon MSK no desenho cloud
DadosPostgreSQL 16 para escrita, Outbox e read model; Redis 7 para idempotência
CloudAWS EKS, API Gateway, SQS, SNS/SES, S3, WAF, RDS, ElastiCache e MSK
Infraestrutura como códigoTerraform para provisionamento AWS e manifests Kubernetes para EKS
Observabilidade e CISpring Actuator, health checks por serviço, Maven multi-module e GitHub Actions

Fluxo Operacional

A jornada separa a emissão do boleto pelo PJ Parceiro, o pagamento no PSP/Banco externo, o webhook de retorno, a validação do pagamento, a atualização do read model e a notificação final.

Fluxos das jornadas de emissão de boleto, registro externo, retorno externo de pagamento, consulta e notificação.
1. EmissãoPJ Parceiro envia POST /boletos e o boleto-service cria o agregado.
2. OutboxBoleto e evento boleto.gerado são persistidos na mesma transação.
3. RegistroA registradora bancária é simulada via /simulacoes/registradora/boletos.
4. RetornoPSP/Banco externo envia webhook de pagamento pela borda/API antes do payment-service.
5. ValidaçãoValor pago e vencimento determinam aprovação ou rejeição.
6. Consultaquery-service atualiza o read model a partir dos eventos.
7. Notificaçãonotification-service publica notificacao.enviada.

Arquitetura AWS

O desenho organiza PJ Parceiro, Cliente Pagador, PSP/Banco externo, borda segura, SQS, EKS, MSK, dados, serviços gerenciados e fluxos numerados de emissão e pagamento.

Diagrama de arquitetura AWS do Received Bank com PJ Parceiro, Cliente Pagador, PSP/Banco externo, AWS WAF, API Gateway, SQS, EKS, MSK, RDS, ElastiCache, S3, SNS/SES, CloudWatch, Secrets Manager, IAM/IRSA e ECR.
CamadaLocalAWS
Borda e segurançaREST local diretoAWS WAF e API Gateway para emissão de boleto e webhook de pagamento
Entrada assíncronaChamadas REST para os serviçosSQS boleto-generation com DLQ para emissão de boletos
ComputeDocker ComposeAmazon EKS com quatro microsserviços e outbox worker
DadosPostgreSQL e Redis em containersRDS PostgreSQL e ElastiCache Redis
EventosRedpanda compatível com KafkaAmazon MSK
Serviços gerenciadosVariáveis de ambiente e ActuatorCloudWatch, Secrets Manager, IAM/IRSA, ECR e SNS/SES

Padrões Aplicados

As escolhas arquiteturais foram usadas para reduzir acoplamento, preservar consistência, facilitar testes e manter cada bounded context com responsabilidades claras.

DDD e Arquitetura Hexagonal

Cada microsserviço representa um bounded context. As regras ficam em domain, os casos de uso em application e HTTP, Kafka e JPA entram como adapters.

CQRS

boleto-service concentra o modelo de escrita. query-service consome eventos e mantém um read model independente para consultas.

Transactional Outbox

O outbox-worker publica eventos gravados junto com a transação de negócio, evitando inconsistências entre banco e Kafka.

Resiliência e idempotência

SQS absorve picos na emissão, DLQ isola falhas, Kafka DLT apoia reprocessamento e Redis sustenta idempotência.

Decisões Arquiteturais

As ADRs registram contexto, alternativas consideradas e consequências das decisões centrais do projeto.

ADR-001 · Transactional Outbox vs Saga

Outbox foi escolhido para garantir uma transação ACID cobrindo boleto e evento, sem coordenação distribuída.

ADR-002 · CQRS com banco compartilhado

Separação lógica em desenvolvimento, com caminho claro para separar fisicamente em alto volume.

ADR-003 · API Gateway para SQS

Entrada assíncrona absorve picos e permite resposta 202 Accepted com processamento posterior.

ADR-004 · Arquitetura Hexagonal

Casos de uso testáveis sem Spring, banco ou Kafka, com adapters substituíveis.

Arquivo completo: received-bank-services/docs/architecture/ARCHITECTURE_DECISION_RECORD.md

Serviços

O módulo received-bank-services agrupa os microsserviços Maven e os commons compartilhados do domínio e infraestrutura.

ServiçoPortaResponsabilidadeEventos
boleto-service 8081 Cria e consulta boletos no modelo de escrita, aplica regras de domínio e grava eventos no Outbox. Produz boleto.gerado
query-service 8082 Mantém o read model de boletos e expõe consultas por boleto ou status. Consome eventos de domínio
payment-service 8083 Consome boletos gerados, recebe webhook de pagamento vindo do PSP/Banco externo e valida valor e vencimento. Produz pagamento.efetivado ou pagamento.rejeitado
notification-service 8084 Consome eventos de boleto e pagamento para emitir notificações do resultado. Produz notificacao.enviada

APIs Principais

Os endpoints cobrem a jornada de boleto de ponta a ponta e podem ser exercitados pelas coleções versionadas de Postman e Insomnia.

MétodoEndpointServiçoDescrição
POST/boletosboleto-serviceCria um boleto e retorna 201 Created.
GET/boletos/{id}boleto-serviceConsulta um boleto pelo identificador no modelo de escrita.
POST/simulacoes/registradora/boletosboleto-serviceSimula registro externo de boleto.
POST/simulacoes/pagamentospayment-serviceSimula, localmente, o webhook de pagamento que viria do PSP/Banco externo.
GET/consultas/boletosquery-serviceLista boletos do read model, com filtro opcional por status.
GET/consultas/boletos/{boletoId}query-serviceConsulta um boleto no read model.
Health checks

http://localhost:8081/actuator/health

http://localhost:8082/actuator/health

http://localhost:8083/actuator/health

http://localhost:8084/actuator/health

Ambiente Local

O ambiente local usa Maven Wrapper e Docker Compose para subir os serviços e dependências de infraestrutura.

cd received-bank-services
./mvnw clean test
docker compose up --build
Dependências locais
PostgreSQL 5432 Redis 6379 Redpanda 9092 Docker Compose

Coleções de API

Importe uma das coleções para executar a jornada completa: health checks, emissão do boleto, retorno simulado de pagamento aprovado, consulta CQRS e cenário de rejeição por regra de negócio.

Cloud e Infraestrutura como Código

Use os comandos abaixo para inicializar o Terraform, revisar o plano de execução e provisionar a infraestrutura AWS do projeto com as credenciais configuradas no ambiente local.

ÁreaRecursos
Rede e computeVPC, subnets públicas e privadas, NAT Gateway, EKS Cluster, node group e ALB Ingress Controller.
Dados e mensagensRDS PostgreSQL, ElastiCache Redis, SQS com DLQ, Amazon MSK, S3 para documentos e backups.
SegurançaSecurity Groups, IAM roles com IRSA por service account, Secrets Manager e Kubernetes Secrets de exemplo.
ObservabilidadeCloudWatch Log Groups, métricas via Actuator e Prometheus, alertas via SNS.
cd received-bank-services/infra/aws/terraform
cp terraform.tfvars.example terraform.tfvars
terraform init
terraform plan
terraform apply
Provisionamento AWS

terraform init prepara o diretório e baixa os providers necessários.

terraform plan mostra quais recursos serão criados, alterados ou removidos.

terraform apply executa o plano e cria os recursos na conta AWS ativa.

Atenção sobre credenciais e custos

Esses comandos usam as credenciais AWS configuradas no ambiente de quem executa. Eles não usam uma conta fixa do repositório. Ao rodar terraform apply, os recursos serão criados na conta AWS ativa e podem gerar custos.