distributed-services-spring

distributed-services-spring cover

Project Info

Technologies

Java
Spring Boot
MongoDB
OpenFeign
Swagger
Docker

Project Gallery

Cover

Cover

Descrição do Projeto

Descrição do Projeto

Visão Geral do Projeto

Distributed Services with Spring é um laboratório de microsserviços concebido para mostrar, de ponta a ponta, como duas aplicações Spring Boot podem cooperar num ecossistema distribuído e ainda assim oferecer uma experiência coesa ao consumidor final.

PapelServiçoPortaResponsabilidade principal
BFF / API GatewayMicroserviceA8080Receber requisições REST, agregar/filtrar dados e devolver a resposta já adaptada ao cliente.
Core Domain ServiceMicroserviceB8081Orquestrar chamadas à API pública JsonPlaceholder, transformar os payloads e persistir tudo no MongoDB.

Arquitetura de Alto Nível

Diagrama Arquitetural
  • Client → MicroserviceA: HTTP/JSON (CRUD Posts & Comments)
  • MicroserviceA → MicroserviceB: OpenFeign (REST)
  • MicroserviceB → JsonPlaceholder: REST (/posts, /comments)
  • MicroserviceB → MongoDB: Spring Data (Reactive)
  • MicroserviceA → Client: HTTP 200/201... (DTOs adaptados)

Fluxo

  1. O cliente envia uma requisição (ex.: POST /posts).
  2. O MicroserviceA valida o payload, dispara uma chamada Feign ao MicroserviceB e espera a resposta.
  3. O MicroserviceB decide se deve buscar dados na cache/MongoDB ou bater na JsonPlaceholder. Caso seja a primeira vez, sincroniza e persiste.
  4. O resultado é devolvido a MicroserviceA, que o transforma em DTO enxuto (anti‑corruption layer) antes de responder ao cliente.

Motivo da separação entre microserviço A e B

CritérioBenefício da separação
SegurançaExpor apenas o BFF reduz a superfície de ataque; B fica isolado na rede interna.
EscalabilidadeMicroserviceB pode escalar horizontalmente em função das leituras/gravações, sem impactar o gateway.
Responsabilidade ÚnicaCada serviço concentra um bounded context: apresentação vs. domínio & integração externa.
Evolução independenteMudanças no modelo de domínio ou na API pública exigem apenas deploy do MicroserviceB.

Camadas internas de cada serviço

MicroserviceA – BFF


┌────────────────────────────┐
│  Controller (Spring Web)   │  → expõe REST ao cliente
├────────────────────────────┤
│  Facade / Service Layer    │  → agrega chamadas, mapeia DTOs
├────────────────────────────┤
│  Feign Clients             │  → proxy REST p/ MicroserviceB
└────────────────────────────┘
Padrões: Controller–Service–DTO, Mapper (MapStruct), Factory Method para responses padronizadas.

MicroserviceB – Core Domain


┌────────────────────────────┐
│  Controller                │
├────────────────────────────┤
│  Application Service       │  → orquestra regras
├────────────────────────────┤
│  Domain Models             │  → Post, Comment (entidades)
├────────────────────────────┤
│  Repository (Spring Data)  │  → MongoReactiveTemplate
├────────────────────────────┤
│  Integration Layer         │  → Feign p/ JsonPlaceholder
└────────────────────────────┘
Padrões: Hexagonal / Ports & Adapters
Resiliência: prontos para Retry e Circuit Breaker (Resilience4j) – basta ativar as annotations.

Principais Casos de Uso

CasoCaminho FelizPontos de atenção
Sincronizar dados iniciaisPOST /api/posts/syncDataOperação idempotente; usa bulk insert no Mongo.
CRUD de PostsGET /posts, POST /posts, PUT /posts/{id}, DELETE /posts/{id}Validação Bean Validation no A, regras de negócio no B.
CRUD de CommentsAnálogo a PostsComentários referenciam o _id do Post (chave Mongo).

Tecnologias e Racional de Escolha

  • Spring Boot 3.4 – suporte nativo a Java 17, AOT, observabilidade Micrometer.
  • OpenFeign – evita boilerplate HTTP, facilita testes de contrato.
  • MongoDB 4.4 + Spring Data Reactive – modelo flexível, driver não‑bloqueante.
  • Swagger/OpenAPI – documentação viva; compatível com Swagger UI, Postman e geradores de SDK.
  • Maven – build determinístico, fácil integração com CI/CD.
  • JUnit 5 + Testcontainers – testes de integração sob um MongoDB real.