Skip to content

Repository files navigation

Hotel Booking System (микросервисы)

Проект демонстрирует бронирование номеров в отелях с двухшаговым подтверждением (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

Быстрый старт (локально)

  1. Запустить Eureka: eureka-server
  2. Запустить Gateway: api-gateway
  3. Запустить auth-service
  4. Запустить hotel-service
  5. Запустить booking-service

Проверка Eureka: http://localhost:8761

Тестирование эндпоинтов

Откройте файл booking-system.http в IntelliJ IDEA и выполняйте запросы по очереди:

  • login (USER/ADMIN) → получите токены
  • CRUD отелей/номеров
  • рекомендация доступных номеров (с фильтром по датам)
  • создание бронирования (идемпотентность по X-Request-Id)
  • статистика загрузки номеров

Алгоритм планирования занятости (Hotel Service)

  • Даты трактуются как [startDate, endDate) (endDate = дата выезда)
    Это позволяет бронированиям "стыковаться" без конфликта: 10–12 и 12–15 — допустимо.
  • При подтверждении доступности используется:
    • идемпотентность по requestId (повторный запрос не меняет состояние и не увеличивает статистику)
    • pessimistic lock на строке rooms (защита от гонок при параллельных подтверждениях)
    • проверка пересечений по таблице room_reservations
  • При рекомендации доступных номеров:
    • берутся только свободные на заданный диапазон
    • сортировка: times_booked ASC, при равенстве — id ASC

Saga в Booking Service

  1. Создать бронирование со статусом PENDING
  2. Вызвать Hotel Service: confirm-availability
  3. Если успех → CONFIRMED
  4. Если ошибка/таймаут → 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
Loading

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages