Backend production-ready para gerenciamento de biblioteca, evoluindo de monolito para arquitetura de microservices.
Este repositório adota estrutura monorepo com Gradle multi-project.
library-api/
├── library-api/ # Monolito original (v1.3.1) — Spring Boot 4 + JWT + Redis + S3
├── config-server/ # Spring Cloud Config Server — configuração centralizada
├── eureka-server/ # Netflix Eureka — service discovery
├── gateway/ # Spring Cloud Gateway — entrada única + JWT centralizado
├── auth-service/ # Autenticação, usuários e refresh tokens
├── catalog-service/ # Livros, autores, categorias e upload S3
├── loan-service/ # Empréstimos com Feign + Circuit Breaker
└── config-repo/ # Repositório de configurações (YAML por serviço)
Monolito production-ready com bounded contexts bem definidos, preparado para extração em microservices.
📁 library-api/
📖 Documentação completa do monolito
Stack:
- Java 25 + Spring Boot 4.x
- PostgreSQL 16 + Flyway (schemas isolados:
auth,catalog,lending) - Redis 7 (cache distribuído)
- JWT + Refresh Token Rotation
- AWS S3 (upload de imagens com compressão automática)
- Resilience4j (Circuit Breaker + Retry)
- OpenTelemetry + Zipkin (tracing distribuído)
- Prometheus + Grafana (observabilidade)
- Testcontainers + JaCoCo (80%+ cobertura obrigatória)
- SonarCloud + Codecov + GitHub Actions
Extração do monolito em microservices usando o padrão Strangler Fig.
| Serviço | Descrição | Status |
|---|---|---|
config-server/ |
Configuração centralizada | ✅ Concluído |
eureka-server/ |
Service discovery | ✅ Concluído |
gateway/ |
API Gateway + JWT | ✅ Concluído |
auth-service/ |
Autenticação | ✅ Concluído |
catalog-service/ |
Catálogo de livros | ✅ Concluído |
loan-service/ |
Empréstimos | ✅ Concluído |
Decisões arquiteturais:
- Monorepo com Gradle multi-project
- Spring Cloud Config (configuração centralizada)
- Netflix Eureka (service discovery com path para Kubernetes)
- Spring Cloud Gateway com JWT centralizado (downstream services confiam nos headers)
- OpenFeign + Resilience4j (comunicação entre serviços com Circuit Breaker)
- Um banco PostgreSQL com schemas isolados por serviço
Acompanhe o progresso no GitHub Projects
Acompanhe o progresso no Fase 4 - Roadmap
Visão geral
Fase 4
├── Etapa 1 — RabbitMQ (mensageria)
├── Etapa 2 — Testes de carga (k6)
│ ├── Monolito sem otimização
│ ├── Monolito com cache Redis
│ ├── Microservices sem cache
│ └── Microservices com cache
└── Etapa 3 — Análise e documentação dos resultados
O projeto possui dois modos de execução:
- dev → ambiente voltado para desenvolvimento e avaliação
- prod → ambiente containerizado simulando produção
git clone https://github.com/erichiroshi/library-api.git
cd library-apiRefresh Gradle project em cada serviço → Executar a aplicação
./gradlew clean buildNesse modo a infraestrutura é executada via Docker e a aplicação pode ser iniciada via terminal ou IDE.
Rodar via CLI - perfil dev
# 1. Infraestrutra + Observabilidade + Mensageria
# Docker Compose (Postgres + Redis + PgAdmin + Grafana + Prometheus + Zipkin + RabbitMQ)
cd library-api
docker compose -f docker-compose.dev.yml up -d
# 2. Config Server
cd config-server
./gradlew bootRun
# Acesse: http://localhost:8888/actuator/health
# 3. Eureka Server (requer Config Server rodando)
cd eureka-server
./gradlew bootRun --args='--spring.profiles.active=dev'
# Acesse: http://localhost:8761
# Acesse: http://localhost:8761/actuator/health
# 4. Gateway (requer Config Server e Eureka Server rodando)
cd gateway
./gradlew bootRun --args='--spring.profiles.active=dev'
# Acesse: http://localhost:8080/actuator/health
# 5. Auth Service (requer Config Server, Eureka e Postgres)
cd auth-service
./gradlew bootRun --args='--spring.profiles.active=dev'
# Acesse: http://localhost:{port-spring}/actuator/health
# 6. Catalog Service (requer Config Server, Eureka e Postgres)
cd catalog-service
./gradlew bootRun --args='--spring.profiles.active=dev'
# Acesse: http://localhost:{port-spring}/actuator/health
# 7. Loan Service (requer Config Server, Eureka e Postgres)
cd loan-service
./gradlew bootRun --args='--spring.profiles.active=dev'
# Acesse: http://localhost:{port-spring}/actuator/healthDocker Compose completo disponível.
docker compose up -d
docker compose up #ver os logs no terminalServiços disponíveis após o startup:
- API Gateway:
http://localhost:8080 - Eureka Dashboard:
http://localhost:8761 - Config Server:
http://localhost:8888 - Prometheus:
http://localhost:9090 - Grafana:
http://localhost:3000(admin/admin) - Zipkin:
http://localhost:9411 - RabbitMQ:
http://localhost:15672(guest/guest)
Credenciais de teste:
- ADMIN:
joao.silva@email.com/123456
Ordem de subida (automática via depends_on):
postgres + redis → config-server → eureka-server → gateway
→ auth-service + catalog-service → loan-service
→ prometheus + grafana + zipkin + RabbitMQ
docker compose down # Para os containers
docker compose down -v # Para e remove volumes (apaga banco)- ~8.000 linhas de código
- 125+ testes (unit + integration)
- 80%+ cobertura (JaCoCo)
- 30+ endpoints REST versionados
- 6 serviços extraídos do monolito
- 10+ containers orquestrados via Docker Compose
- 1 ponto de entrada (Gateway com JWT centralizado)
- 3 schemas isolados por domínio (auth, catalog, lending)
- W3C Trace Context propagado em todos os serviços
Eric Hiroshi — Backend Engineer · Java / Spring Boot