catalog
Uma API REST de eventos e locais: Spring Boot, PostgreSQL, Flyway, um container — e a sua latência sem carga
Durante a venda relâmpago, quantas leituras da página do evento acontecem para cada alteração de um administrador?
GET
/catalog/events?city=&page=&size=
/catalog/events/{id}
404
POST
/catalog/events
201
Location
PUT
DELETE
200
204
/catalog/venues
Tudo sob /catalog: o edge e o gateway roteiam sem reescrever caminhos.
/catalog
size ≤ 50
BigDecimal
NUMERIC(10,2)
TIMESTAMPTZ
problem+json
201 Created
Na entrevista: recursos + verbos, estratégia de paginação, modelo de erros.
@Transactional
A API nunca devolve entidades: só records (EventOut, VenueOut). Uma coluna nova não pode vazar; uma associação lazy não pode explodir.
EventOut
VenueOut
@GetMapping public PageOut<EventOut> list( @RequestParam(required = false) String city, @RequestParam(defaultValue = "0") @Min(0) int page, @RequestParam(defaultValue = "20") @Min(1) @Max(50) int size)
@Valid @RequestBody EventIn
400
?size=500
400 problem+json
Listar 20 eventos, cada um com o seu local. Quantas consultas SQL?
join fetch
select e from Event e join fetch e.venue
V1__create_catalog.sql
V2__seed_catalog.sql
V3__...
ddl-auto: validate
generate_series
Volume realista de propósito: uma consulta instantânea com 10 linhas pode levar dezenas de ms com 200.000.
FROM maven:3.9-eclipse-temurin-21 AS build RUN --mount=type=cache,target=/root/.m2 mvn -B -q package -DskipTests FROM eclipse-temurin:21-jre COPY --from=build /src/target/app.jar app.jar USER app ENTRYPOINT ["java", "-XX:MaxRAMPercentage=75", "-jar", "app.jar"]
db
depends_on: condition: service_healthy
pg_isready
db-data
down
down -v
/actuator/health/readiness
Dentro de um container, o banco é db, não localhost.
localhost
k6 run load/smoke.js # 1 VU, 30 s, think time 0.5 s
GET /catalog/events/{id}
GET /catalog/events?city=
Números de um notebook — registre os seus em results/lab1.md.
results/lab1.md
count(*)
Qual endpoint vai quebrar primeiro sob carga? Anote a hipótese para o lab 2.
docker compose up --build
Roteiro: (1) por que o catalog primeiro; (2) o contrato da API; (3) camadas e DTOs; (4) JPA, N+1, o pool; (5) Flyway; (6) Dockerfile e Compose; (7) smoke test e tempo de serviço.