Skip to content

Commit 5771632

Browse files
committed
docs(readme): update README and readme_pdf
- Update Flyway migration count from 6 to 9 in metrics section - Add Schema per Service to Persistence stack section - Add Bounded Contexts table to Architecture section - Add anti-corruption layer decision to Architectural Decisions section - Add Schema per Service decision to Architectural Decisions section - Mark Microservices as completed in Next Steps - Add Extraction of Auth-Service as next pending step - Add 3 bounded contexts metric to Project Metrics section
1 parent 2a8ad9c commit 5771632

File tree

11 files changed

+70
-18
lines changed

11 files changed

+70
-18
lines changed

readme.md

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@ Uma biblioteca precisa:
251251

252252
### Persistência
253253
- **PostgreSQL 16** (banco relacional)
254-
- **Flyway** (versionamento de schema — 6 migrations)
254+
- **Flyway** (versionamento de schema — 9 migrations)
255+
- **Schema per Service** (schemas `auth`, `catalog` e `lending` isolados no mesmo banco)
255256

256257
### Cache
257258
- **Redis 7** (cache distribuído com TTL de 2 minutos)
@@ -354,6 +355,14 @@ com.example.library/
354355
└── user/ # Entidade User + UserDetailsService
355356
```
356357

358+
### Bounded Contexts definidos
359+
360+
| Contexto | Responsabilidade | Schema |
361+
|---|---|---|
362+
| `auth` | Autenticação, usuários, refresh tokens | `auth` |
363+
| `catalog` | Livros, autores, categorias | `catalog` |
364+
| `lending` | Empréstimos e itens de empréstimo | `lending` |
365+
357366
### Fluxo de Observabilidade
358367

359368
```
@@ -436,6 +445,20 @@ Request → Controller → Service → [Cache Hit? → Return]
436445

437446
**Benefício:** Circuit Breaker evita cascata de falhas; Retry com backoff trata falhas transitórias. Padrão já estabelecido para quando LoanService precisar chamar BookService via HTTP.
438447

448+
### ✔ Interfaces de anticorrupção entre domínios
449+
**Por quê:** `BookService` injetava `AuthorRepository` e `CategoryRepository` diretamente. `LoanService` injetava `BookRepository` e `UserRepository`. Injeção direta de repositórios entre domínios cria acoplamento estrutural que impede extração futura em microservices.
450+
451+
**Implementação:** Cada domínio expõe uma interface de lookup (`AuthorLookupService`, `CategoryLookupService`, `BookLookupService`, `UserLookupService`). Outros domínios dependem da interface, nunca do repositório.
452+
453+
**Benefício:** Trocar a implementação de uma chamada local para HTTP/Feign requer mudança apenas na implementação da interface, sem tocar nos serviços consumidores.
454+
455+
### ✔ Schema per Service no mesmo banco
456+
**Por quê:** Microservices exigem database per service — cada serviço deve possuir e controlar suas próprias tabelas. Separar bancos imediatamente seria prematuro; separar schemas é o passo intermediário seguro.
457+
458+
**Implementação:** Três schemas criados via Flyway (V008/V009): `auth`, `catalog` e `lending`. Entidades anotadas com `@Table(schema = "...")`, tabelas de junção com `@JoinTable(schema = "...")` e coleções com `@CollectionTable(schema = "...")`. HikariCP configurado com `search_path` para resolução automática.
459+
460+
**Benefício:** Fronteiras de dados explícitas sem complexidade operacional de múltiplos bancos. Migração futura para bancos separados requer apenas apontar cada serviço para seu próprio PostgreSQL.
461+
439462
---
440463

441464
## 📊 Observabilidade
@@ -623,15 +646,18 @@ Marca como `OVERDUE` empréstimos com `status = WAITING_RETURN` e `dueDate < hoj
623646
- **80%+** cobertura (JaCoCo)
624647
- **30+** endpoints REST versionados (`/api/v1`)
625648
- **6** serviços Docker orquestrados
626-
- **6** migrations Flyway
649+
- **9** migrations Flyway
627650
- **4** workflows GitHub Actions (CI, Docker, Release, README PDF)
651+
- **3** bounded contexts isolados por schema (`auth`, `catalog`, `lending`)
628652

629653
---
630654

631655
## 🔮 Próximos Passos
632656

633657
- [x] **Rate limiting** — Bucket4j ou Resilience4j
634658
- [x] **OpenTelemetry** — Tracing distribuído
659+
- [x] **Microservices** — Bounded contexts definidos, anticorrupção e schema per service implementados
660+
- [ ] **Extração Auth-Service** — primeiro serviço independente (menor e mais isolado)
635661
- [ ] **Deploy em cloud** — AWS ECS ou Render
636662
- [ ] **HATEOAS** — Hypermedia links
637663
- [ ] **WebSockets** — Notificações real-time de devolução

readme_pdf.md

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ Uma biblioteca precisa:
240240

241241
### Persistência
242242
- **PostgreSQL 16** (banco relacional)
243-
- **Flyway** (versionamento de schema — 6 migrations)
243+
- **Flyway** (versionamento de schema — 9 migrations)
244+
- **Schema per Service** (schemas `auth`, `catalog` e `lending` isolados no mesmo banco)
244245

245246
### Cache
246247
- **Redis 7** (cache distribuído com TTL de 2 minutos)
@@ -343,6 +344,14 @@ com.example.library/
343344
└── user/ # Entidade User + UserDetailsService
344345
```
345346

347+
### Bounded Contexts definidos
348+
349+
| Contexto | Responsabilidade | Schema |
350+
|---|---|---|
351+
| `auth` | Autenticação, usuários, refresh tokens | `auth` |
352+
| `catalog` | Livros, autores, categorias | `catalog` |
353+
| `lending` | Empréstimos e itens de empréstimo | `lending` |
354+
346355
### Fluxo de Observabilidade
347356

348357
```
@@ -425,6 +434,20 @@ Request → Controller → Service → [Cache Hit? → Return]
425434

426435
**Benefício:** Circuit Breaker evita cascata de falhas; Retry com backoff trata falhas transitórias. Padrão já estabelecido para quando LoanService precisar chamar BookService via HTTP.
427436

437+
### ✔ Interfaces de anticorrupção entre domínios
438+
**Por quê:** `BookService` injetava `AuthorRepository` e `CategoryRepository` diretamente. `LoanService` injetava `BookRepository` e `UserRepository`. Injeção direta de repositórios entre domínios cria acoplamento estrutural que impede extração futura em microservices.
439+
440+
**Implementação:** Cada domínio expõe uma interface de lookup (`AuthorLookupService`, `CategoryLookupService`, `BookLookupService`, `UserLookupService`). Outros domínios dependem da interface, nunca do repositório.
441+
442+
**Benefício:** Trocar a implementação de uma chamada local para HTTP/Feign requer mudança apenas na implementação da interface, sem tocar nos serviços consumidores.
443+
444+
### ✔ Schema per Service no mesmo banco
445+
**Por quê:** Microservices exigem database per service — cada serviço deve possuir e controlar suas próprias tabelas. Separar bancos imediatamente seria prematuro; separar schemas é o passo intermediário seguro.
446+
447+
**Implementação:** Três schemas criados via Flyway (V008/V009): `auth`, `catalog` e `lending`. Entidades anotadas com `@Table(schema = "...")`, tabelas de junção com `@JoinTable(schema = "...")` e coleções com `@CollectionTable(schema = "...")`. HikariCP configurado com `search_path` para resolução automática.
448+
449+
**Benefício:** Fronteiras de dados explícitas sem complexidade operacional de múltiplos bancos. Migração futura para bancos separados requer apenas apontar cada serviço para seu próprio PostgreSQL.
450+
428451
---
429452

430453
## Observabilidade
@@ -613,16 +636,19 @@ Marca como `OVERDUE` empréstimos com `status = WAITING_RETURN` e `dueDate < hoj
613636
- **80%+** cobertura (JaCoCo)
614637
- **30+** endpoints REST versionados (`/api/v1`)
615638
- **6** serviços Docker orquestrados
616-
- **6** migrations Flyway
639+
- **9** migrations Flyway
617640
- **4** workflows GitHub Actions (CI, Docker, Release, README PDF)
641+
- **3** bounded contexts isolados por schema (`auth`, `catalog`, `lending`)
618642

619643
---
620644

621645
## Próximos Passos
622646

623647
- [x] **Rate limiting** — Bucket4j ou Resilience4j
624648
- [x] **OpenTelemetry** — Tracing distribuído
649+
- [x] **Microservices** — Bounded contexts definidos, anticorrupção e schema per service implementados
625650
- [ ] **Deploy em cloud** — AWS ECS ou Render
651+
- [ ] **Extração Auth-Service** — primeiro serviço independente (menor e mais isolado)
626652
- [ ] **HATEOAS** — Hypermedia links
627653
- [ ] **WebSockets** — Notificações real-time de devolução
628654
- [ ] **Microservices** — Extração em serviços independentes

src/main/java/com/example/library/author/AuthorPort.java renamed to src/main/java/com/example/library/author/AuthorLookupService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import java.util.Collection;
44
import java.util.Set;
55

6-
public interface AuthorPort {
6+
public interface AuthorLookupService {
77
Set<Author> findAllById(Collection<Long> ids);
88

99
int countByIds(Collection<Long> ids);

src/main/java/com/example/library/author/AuthorAdapter.java renamed to src/main/java/com/example/library/author/AuthorLookupServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
@Service
1313
@RequiredArgsConstructor
14-
public class AuthorAdapter implements AuthorPort {
14+
public class AuthorLookupServiceImpl implements AuthorLookupService {
1515

1616
private final AuthorRepository repository;
1717

src/main/java/com/example/library/book/BookAvailabilityPort.java renamed to src/main/java/com/example/library/book/BookLookupService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import java.util.Optional;
44

5-
public interface BookAvailabilityPort {
5+
public interface BookLookupService {
66
Optional<Book> findById(Long id);
77

88
int decrementCopies(Long id);

src/main/java/com/example/library/book/BookRepositoryAdapter.java renamed to src/main/java/com/example/library/book/BookLookupServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
@Service
1111
@RequiredArgsConstructor
12-
public class BookRepositoryAdapter implements BookAvailabilityPort {
12+
public class BookLookupServiceImpl implements BookLookupService {
1313

1414
private final BookRepository repository;
1515

src/main/java/com/example/library/book/BookService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import io.micrometer.core.instrument.Counter;
2121

2222
import com.example.library.author.Author;
23-
import com.example.library.author.AuthorPort;
23+
import com.example.library.author.AuthorLookupService;
2424
import com.example.library.aws.S3Service;
2525
import com.example.library.book.dto.BookCreateDTO;
2626
import com.example.library.book.dto.BookResponseDTO;
@@ -29,7 +29,7 @@
2929
import com.example.library.book.exception.InvalidOperationException;
3030
import com.example.library.book.mapper.BookMapper;
3131
import com.example.library.category.Category;
32-
import com.example.library.category.CategoryPort;
32+
import com.example.library.category.CategoryLookupService;
3333
import com.example.library.category.exception.CategoryNotFoundException;
3434
import com.example.library.common.config.delay_cache_test.ArtificialDelayService;
3535
import com.example.library.common.dto.PageResponseDTO;
@@ -44,8 +44,8 @@ public class BookService {
4444
private static final String S3_FOLDER_NAME = "books/";
4545

4646
private final BookRepository repository;
47-
private final AuthorPort authorPort;
48-
private final CategoryPort categoryPort;
47+
private final AuthorLookupService authorPort;
48+
private final CategoryLookupService categoryPort;
4949
private final BookMapper mapper;
5050
private final S3Service s3Service;
5151

src/main/java/com/example/library/category/CategoryPort.java renamed to src/main/java/com/example/library/category/CategoryLookupService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
import java.util.Optional;
44

5-
public interface CategoryPort {
5+
public interface CategoryLookupService {
66
Optional<Category> findById(Long id);
77
}

src/main/java/com/example/library/category/CategoryAdapter.java renamed to src/main/java/com/example/library/category/CategoryLookupServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
@Service
1111
@RequiredArgsConstructor
12-
public class CategoryAdapter implements CategoryPort {
12+
public class CategoryLookupServiceImpl implements CategoryLookupService {
1313

1414
private final CategoryRepository repository;
1515

src/main/java/com/example/library/loan/LoanService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import org.springframework.transaction.annotation.Transactional;
1515

1616
import com.example.library.book.Book;
17-
import com.example.library.book.BookAvailabilityPort;
17+
import com.example.library.book.BookLookupService;
1818
import com.example.library.book.exception.BookNotFoundException;
1919
import com.example.library.loan.dto.LoanCreateDTO;
2020
import com.example.library.loan.dto.LoanResponseDTO;
@@ -39,7 +39,7 @@ public class LoanService {
3939
private static final Logger log = LoggerFactory.getLogger(LoanService.class);
4040

4141
private final LoanRepository loanRepository;
42-
private final BookAvailabilityPort bookAvailabilityPort; // usado apenas para verificação e decrement atômico na criação
42+
private final BookLookupService bookAvailabilityPort; // usado apenas para verificação e decrement atômico na criação
4343
private final UserLookupService userLookupService; // usado para validar existência de usuários em consultas administrativas
4444
private final LoanMapper mapper;
4545
private final ApplicationEventPublisher eventPublisher;

0 commit comments

Comments
 (0)