distributed-services-spring

Project Info
Technologies
Java
Spring Boot
MongoDB
OpenFeign
Swagger
Docker
Project Links
Project Gallery

Cover

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.
| Papel | Serviço | Porta | Responsabilidade principal |
|---|---|---|---|
| BFF / API Gateway | MicroserviceA | 8080 | Receber requisições REST, agregar/filtrar dados e devolver a resposta já adaptada ao cliente. |
| Core Domain Service | MicroserviceB | 8081 | Orquestrar chamadas à API pública JsonPlaceholder, transformar os payloads e persistir tudo no MongoDB. |
Arquitetura de Alto Nível

- 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
- O cliente envia uma requisição (ex.: POST /posts).
- O MicroserviceA valida o payload, dispara uma chamada Feign ao MicroserviceB e espera a resposta.
- O MicroserviceB decide se deve buscar dados na cache/MongoDB ou bater na JsonPlaceholder. Caso seja a primeira vez, sincroniza e persiste.
- 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ério | Benefício da separação |
|---|---|
| Segurança | Expor apenas o BFF reduz a superfície de ataque; B fica isolado na rede interna. |
| Escalabilidade | MicroserviceB pode escalar horizontalmente em função das leituras/gravações, sem impactar o gateway. |
| Responsabilidade Única | Cada serviço concentra um bounded context: apresentação vs. domínio & integração externa. |
| Evolução independente | Mudanç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
| Caso | Caminho Feliz | Pontos de atenção |
|---|---|---|
| Sincronizar dados iniciais | POST /api/posts/syncData | Operação idempotente; usa bulk insert no Mongo. |
| CRUD de Posts | GET /posts, POST /posts, PUT /posts/{id}, DELETE /posts/{id} | Validação Bean Validation no A, regras de negócio no B. |
| CRUD de Comments | Análogo a Posts | Comentá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.