Обзор архитектуры
Relevant source files
The following files were used as context for generating this wiki page:
Данная страница предоставляет технический обзор архитектуры Music Subscription Service — бэкенд-платформы для музыкального сервиса, написанной на языке Go. Проект спроектирован с использованием чистой архитектуры и разделения по функциональным особенностям (features), что обеспечивает масштабируемость и тестируемость системы.
Основная цель архитектуры — предоставить REST API для управления музыкальным каталогом, пользовательскими плейлистами, историей прослушивания и системой подписок с поддержкой ролевой модели доступа.
Общая структура системы
Система построена на микросервисном подходе внутри монолита, где функциональные модули изолированы в директории internal/features. Внешние зависимости, такие как базы данных и кэширование, вынесены в internal/core.
Компоненты инфраструктуры
| Компонент | Технология | Назначение |
|---|---|---|
| Language | Go 1.21 | Основной язык разработки |
| HTTP Framework | Chi v5 | Маршрутизация запросов |
| Database | PostgreSQL 16 | Персистентное хранение данных |
| Cache | Redis 7 | Кэширование и лимитирование (rate limiting) |
| Configuration | Environment variables | Управление настройками окружения |
Sources: README.md:143-154, docker-compose.yml:25-54
Диаграмма потока данных
Ниже представлена высокоуровневая диаграмма прохождения запроса через систему от клиента до уровня хранения данных.
Диаграмма показывает путь запроса через слои промежуточного ПО (Middleware), бизнес-логики и доступа к данным.
Sources: cmd/app/main.go:128-154, internal/core/middleware/middleware.go:40-150
Организация кода (Layered Architecture)
Проект следует четкому разделению ответственности между слоями:
- Transport (HTTP): Обрабатывает входящие HTTP-запросы, валидирует входные данные и формирует JSON-ответы.
- Service: Содержит бизнес-логику, правила подписок (например, лимиты для FREE пользователей) и координирует работу между репозиториями.
- Repository: Отвечает за взаимодействие с БД (PostgreSQL) и кэшем (Redis).
- Core: Общие компоненты, такие как конфигурация, логирование и глобальные middleware.
Схема внедрения зависимостей (DI)
Инициализация всех компонентов происходит в точке входа main.go.
Процесс сборки приложения в main.go от загрузки конфигурации до запуска сервера.
Sources: cmd/app/main.go:50-125
Модель данных (Database Schema)
База данных спроектирована для поддержки сложной иерархии музыкального контента и пользовательских связей.
Схема сущностей базы данных, отражающая отношения между пользователями, контентом и метаданными.
Sources: migrations/001_init.up.sql:1-92
Безопасность и авторизация
Система использует JWT (JSON Web Tokens) для обеспечения безопасности. Реализована ротация токенов (access/refresh) и разграничение прав на основе ролей.
Ключевые аспекты безопасности:
- JWT Access Token: Короткоживущий токен (по умолчанию 15 минут) для авторизации запросов.
- Refresh Token: Долгоживущий токен (по умолчанию 30 дней), хранящийся в базе данных для обновления сессии.
- RBAC (Role-Based Access Control): Проверка роли (например,
ADMIN) через middleware для доступа к защищенным эндпоинтам управления. - Middleware: Цепочка обработчиков для CORS, RequestID, логирования и восстановления после паник (Recoverer).
Sources: internal/core/middleware/middleware.go:121-168, internal/core/config/config.go:42-45, cmd/app/main.go:154-165
Конфигурация системы
Приложение конфигурируется через переменные окружения, что соответствует принципам 12-факторного приложения.
| Переменная | Описание | Значение по умолчанию |
|---|---|---|
APP_PORT | Порт сервера | 8080 |
ENV | Среда запуска | development |
JWT_ACCESS_TTL | Время жизни access токена | 15m |
FREE_DAILY_PLAY_LIMIT | Лимит прослушиваний для FREE | 10 |
FREE_PLAYLIST_LIMIT | Лимит плейлистов для FREE | 3 |
Sources: internal/core/config/config.go:30-52, README.md:46-62
Заключение
Архитектура Music Subscription Service обеспечивает баланс между простотой реализации и гибкостью. Использование слоистой структуры и разделения на фичи позволяет легко добавлять новые функции (например, новые типы подписок или социальные механики) без значительного изменения существующего кода. Система готова к контейнеризации и деплою в облачные среды благодаря поддержке Docker и Fly.io.