Skip to content

Repository files navigation

GozonHSE

Проект представляет собой реализацию бэкенда и фронтенда интернет-магазина. Система построена на микросервисной архитектуре с использованием .NET 8, RabbitMQ, Redis, PostgreSQL и Next.js.

Функциональность

Order Service (Сервис заказов)

  • Создание заказа: Асинхронный процесс. Заказ создается в статусе New, и событие о создании отправляется в брокер сообщений (RabbitMQ).
  • Просмотр заказов: Получение списка заказов пользователя и детальной информации о конкретном заказе.
  • Паттерн Transactional Outbox: Гарантирует атомарное сохранение заказа в БД и отправку события в RabbitMQ.

Payments Service (Сервис оплаты)

  • Управление счетом: Создание счета пользователя и пополнение баланса.
  • Обработка оплаты: Слушает события о создании заказа и списывает средства.
  • Гарантии надежности:
    • Transactional Inbox: Дедупликация входящих сообщений (Idempotency) для предотвращения повторного списания средств (Exactly-Once semantics).
    • Concurrency Control: Optimistic Locking (через RowVersion) для защиты от гонок (Race Conditions) при параллельных запросах к балансу.

Notification Service (Сервис уведомлений)

  • Real-time обновления: Использует SignalR (WebSockets) для мгновенного уведомления фронтенда об изменении статуса заказа (например, "Оплачено").
  • Масштабируемость: Подключен Redis Backplane, что позволяет запускать несколько экземпляров сервиса уведомлений — клиенты получат сообщение независимо от того, к какому инстансу они подключены.

Frontend

  • Отдельное приложение на Next.js.
  • Взаимодействует с микросервисами через API Gateway.
  • Поддерживает WebSocket подключение для получения Push-уведомлений.

API Gateway

  • Построен на Ocelot.
  • Единая точка входа для всех запросов.
  • Маршрутизация и балансировка нагрузки.

Архитектура и Принципы (SOLID / GRASP)

Проект разработан с строгим соблюдением принципов чистого кода и архитектурных паттернов.

SOLID

  • SRP (Single Responsibility Principle): Каждый микросервис отвечает строго за свой домен (Заказы не знают про баланс, Платежи не знают про состав заказа). Внутри кода: Контроллеры отвечают только за HTTP, Сервисы — за бизнес-логику, Consumer-ы — за обработку сообщений.
  • OCP (Open/Closed Principle): Использование MassTransit позволяет добавлять новые обработчики событий (например, сервис логистики), не меняя код отправки событий в OrderService.
  • LSP (Liskov Substitution Principle): Используются абстракции (интерфейсы IOrderService, IPaymentService), что позволяет легко подменять реализации (например, для тестов) без нарушения логики.
  • ISP (Interface Segregation Principle): Интерфейсы событий (IOrderCreatedEvent) содержат только необходимые данные, не перегружая потребителей лишней информацией.
  • DIP (Dependency Inversion Principle): Все зависимости (DbContext, MassTransit Bus, Services) внедряются через Constructor Injection.

GRASP

  • Information Expert: Логика списания средств находится в PaymentService, так как именно он владеет данными о счетах (Account).
  • Controller: OrdersController и PaymentsController выступают как фасад для бизнес-логики, принимая пользовательский ввод и делегируя работу сервисам.
  • Low Coupling: Сервисы общаются асинхронно через RabbitMQ, не имея прямых HTTP-зависимостей друг от друга.

Запуск проекта

Стандартный запуск

Запуск всей инфраструктуры (БД, RabbitMQ, Redis, Бэкенд, Фронтенд):

docker-compose up -d --build

Запуск с масштабированием (Scaling)

Благодаря Stateless-архитектуре и использованию Redis/RabbitMQ, сервисы можно масштабировать горизонтально.

Пример запуска с 2 экземплярами сервиса заказов, 2 экземплярами сервиса оплат и 3 экземплярами сервиса уведомлений:

docker-compose up -d --build --scale orders-service=2 --scale payments-service=2 --scale notification-service=3

Примечание: Ocelot Gateway автоматически распределяет нагрузку между инстансами (Round Robin), а Redis синхронизирует WebSockets между инстансами уведомлений.


Доступ к сервисам

После успешного запуска система доступна по следующим адресам:

Сервис URL Описание
Frontend http://localhost:3000 Веб-интерфейс магазина
API Gateway http://localhost:5000 Единая точка входа для API
Swagger UI http://localhost:5000/swagger Документация API (Общая документация по API)
RabbitMQ http://localhost:15672 Админка брокера (guest/guest)

Полный список API Endpoints (Gateway)

Все запросы выполняются через Api Gateway на http://localhost:5000.

Orders Service

  • POST /orders — Создать новый заказ (запускает процесс оплаты).
  • GET /orders/{id} — Получить информацию и статус конкретного заказа.
  • GET /orders/user/{userId} — Получить историю заказов пользователя.

Payments Service

  • POST /payments/account — Создать счет (Account) для пользователя.
  • POST /payments/deposit — Пополнить баланс счета.
  • GET /payments/{userId} — Узнать текущий баланс пользователя.

Notification Service (SignalR)

  • POST /hub/notifications/negotiate — Инициализация соединения (SignalR Negotiation).
  • GET /hub/notifications — Основной WebSocket Endpoint для подписки на уведомления.

About

Проект представляет собой реализацию бэкенда и фронтенда интернет-магазина. Система построена на микросервисной архитектуре с использованием .NET 8, RabbitMQ, Redis, PostgreSQL и Next.js.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages