Проект демонстрирует бронирование номеров в отелях с двухшаговым подтверждением (PENDING → CONFIRMED) и компенсацией (CANCELLED) по паттерну Saga.
eureka-server— Service Discovery (:8761)api-gateway— единая точка входа + JWT-валидация + трассировка (:8080)auth-service— логин, выпуск JWT, CRUD пользователей (:8081)hotel-service— CRUD отелей/номеров + подтверждение/освобождение доступности + статистикаbooking-service— CRUD бронирований + Saga с компенсацией + идемпотентность поX-Request-Id
- Запустить Eureka:
eureka-server - Запустить Gateway:
api-gateway - Запустить auth-service
- Запустить hotel-service
- Запустить booking-service
Проверка Eureka: http://localhost:8761
Откройте файл booking-system.http в IntelliJ IDEA и выполняйте запросы по очереди:
- login (USER/ADMIN) → получите токены
- CRUD отелей/номеров
- рекомендация доступных номеров (с фильтром по датам)
- создание бронирования (идемпотентность по
X-Request-Id) - статистика загрузки номеров
- Даты трактуются как [startDate, endDate) (endDate = дата выезда)
Это позволяет бронированиям "стыковаться" без конфликта:10–12и12–15— допустимо. - При подтверждении доступности используется:
- идемпотентность по
requestId(повторный запрос не меняет состояние и не увеличивает статистику) - pessimistic lock на строке
rooms(защита от гонок при параллельных подтверждениях) - проверка пересечений по таблице
room_reservations
- идемпотентность по
- При рекомендации доступных номеров:
- берутся только свободные на заданный диапазон
- сортировка:
times_booked ASC, при равенстве —id ASC
- Создать бронирование со статусом
PENDING - Вызвать Hotel Service:
confirm-availability - Если успех →
CONFIRMED - Если ошибка/таймаут →
CANCELLED+ компенсацияrelease(best-effort)
На взаимодействии с Hotel включены:
- Retry/Backoff в координаторе саги
- CircuitBreaker (Resilience4j) — учитываются только транзиентные ошибки (таймауты/5xx)
- ADR:
docs/adr/0001-saga.md - Схема БД:
docs/db-schema.md
flowchart LR
Client -->|HTTP + JWT| GW[API Gateway]
GW -->|/api/auth/*| Auth[auth-service]
GW -->|/api/hotels, /api/rooms| Hotel[hotel-service]
GW -->|/api/bookings| Booking[booking-service]
Booking -->|internal JWT + retry/cb| Hotel
Auth --> Eureka[Eureka]
Hotel --> Eureka
Booking --> Eureka
GW --> Eureka