Skip to content

Implementation Details

plutogr edited this page May 23, 2026 · 2 revisions

Детали реализации (репозиторий TravelAgency)

Сводка по репозиторию: порты, gRPC-контракты, структура решения, инфраструктура Docker и общие компоненты. Используется как справочник при разработке и онбординге.


Содержание

  1. Порты и сервисы
  2. gRPC: контракты и вызовы
  3. Базы данных
  4. Общие библиотеки
  5. Структура решения (sln)
  6. Фронтенд
  7. Переменные окружения (Docker)

1) Порты и сервисы

Сервис Порт (host→container) Описание
gateway 5000→8080 API Gateway (YARP), единая точка входа
identity-service 5010→8080 Identity: auth, JWT, профиль, gRPC GetUserSummary
catalog-service 5020→8080 Catalog: туры, направления, gRPC GetTourSnapshot
booking-service 5030→8080 Booking: заявки, избранное, gRPC ValidateBookingAccess
chat-service 5040→8080 Chat: сообщения по заявке, SignalR /hubs/chat
media-service 5050→8080 Media: загрузка/скачивание файлов, MinIO
frontend 3000→80 SPA (Vite), профиль full в Docker Compose
postgres 5432 Один инстанс, несколько БД
redis 6379 Health check Chat (опционально)
minio 9000, 9001 API и консоль

Клиенты обращаются к Gateway (например, http://localhost:5000); запросы к /api/v1/* проксируются на соответствующий бэкенд с заменой префикса пути (см. Service-Gateway).


2) gRPC: контракты и вызовы

Файлы .proto лежат в TravelAgency.Contracts.Grpc/Protos/.

Identity (identity.proto)

  • Сервис: IdentityGrpc.
  • Метод: GetUserSummary(user_id) → UserSummaryResponse (user_id, email, first_name, last_name, role).
  • Кто вызывает: Booking (при создании заявки/предложения — проверка пользователя).

Catalog (catalog.proto)

  • Сервис: CatalogService.
  • Метод: GetTourSnapshot(tour_id) → TourSnapshotResponse (tour_id, title, description, price, currency, duration_days, snapshot_taken_at, found).
  • Кто вызывает: Booking (при создании заявки/предложения — проверка тура и снимок данных).

Booking (booking.proto)

  • Сервис: BookingService.
  • Метод: ValidateBookingAccess(booking_id, user_id) → ValidateBookingAccessResponse (has_access).
  • Кто вызывает: Chat (перед выдачей сообщений или при подключении к Hub по заявке).

Все межсервисные gRPC-вызовы защищены заголовком с InternalServiceToken (GrpcSettings:InternalServiceToken). Реализация интерцептора и регистрация клиентов — в Shared.Infrastructure и в Infrastructure каждого сервиса.


3) Базы данных

Один экземпляр PostgreSQL; отдельная БД на сервис (database-per-service). Создание БД — скрипт docker/init-db.sql:

  • travel_identity
  • travel_catalog
  • travel_booking
  • travel_chat
  • travel_media

Миграции EF Core хранятся в проекте Infrastructure каждого сервиса. Приложение может применять миграции при старте, если задано ASPNETCORE_RUN_MIGRATIONS=true (типично в Docker Compose).


4) Общие библиотеки

Проект Назначение
TravelAgency.Shared.Contracts Роли (Client, Manager, Admin), политики авторизации (AuthPolicies), DTO/абстракции (ICurrentUserService и др.).
TravelAgency.Contracts.Grpc .proto-файлы (identity, catalog, booking) и сгенерированный C# код для gRPC.
TravelAgency.Shared.Infrastructure Serilog, MediatR, FluentValidation, CorrelationIdMiddleware, GlobalExceptionHandlerMiddleware, маппинг исключений в ProblemDetails (IExceptionMapper), регистрация gRPC-клиентов и GrpcAuthInterceptor.

API и сервисы ссылаются на Shared.Contracts и Shared.Infrastructure; сервисы, участвующие в gRPC, ссылаются на Contracts.Grpc.


5) Структура решения (sln)

  • src/Shared/ — Contracts, Contracts.Grpc, Shared.Infrastructure (+ Tests).
  • src/Gateway/ — Gateway, Gateway.Tests.
  • src/Services/Identity/ — Domain, Application, Infrastructure, API, UnitTests, IntegrationTests.
  • src/Services/Catalog/ — то же.
  • src/Services/Booking/ — Domain, Application, Infrastructure, API, UnitTests, Infrastructure.UnitTests, IntegrationTests.
  • src/Services/Chat/ — Domain, Application, Infrastructure, API, UnitTests, IntegrationTests.
  • src/Services/Media/ — Domain, Application, Infrastructure, API, UnitTests, IntegrationTests.
  • src/Frontend/travel-agency-frontend/ — не в .sln; Vite + React, свой Dockerfile.

Целевая платформа бэкенда: .NET 10 (global.json, Directory.Build.props). Сборка: dotnet build из корня решения; Docker — из папки docker (docker compose up).


6) Фронтенд

  • Путь: src/Frontend/travel-agency-frontend/.
  • Стек: Vite, React, TypeScript.
  • В Docker Compose: сервис frontend, профиль full (запускается только с docker compose --profile full up). Переменная сборки VITE_API_URL — базовый URL к API (обычно к Gateway).
  • Не входит в TravelAgency.sln.

7) Переменные окружения (Docker)

Типичные переменные в .env (или в docker-compose):

Переменная Пример Назначение
POSTGRES_USER postgres Пользователь PostgreSQL
POSTGRES_PASSWORD secret Пароль PostgreSQL
JWT_SIGNING_KEY строка ≥32 символов Подпись JWT (все сервисы и Gateway)
GRPC_INTERNAL_SERVICE_TOKEN секрет Токен для gRPC сервис-сервис
MINIO_ROOT_USER minioadmin MinIO (Media)
MINIO_ROOT_PASSWORD minioadmin MinIO (Media)
VITE_API_URL http://localhost:5000 URL Gateway для фронтенда (при сборке образа)

В compose для каждого сервиса задаются свои ConnectionStrings, JwtSettings, GrpcClients и т.д. (см. docker/docker-compose.yml).


Связанные документы

Clone this wiki locally