Этот проект является бэкендом для приложения-чата, основанного на комнатах и работающего в реальном времени. Он создан на Go, следует принципам Clean Architecture и использует WebSockets для мгновенной связи. Сервис взаимодействует с другими сервисами для аутентификации и получения уведомлений.
example.webm
Проект состоит из трех основных микросервисов, работающих вместе:
- Сервис Аутентификации: Управляет идентификацией пользователей. Этот сервис чата использует его для аутентификации пользователей, подключающихся через WebSocket.
chat-app(Этот сервис): Обеспечивает обмен сообщениями в реальном времени, управление комнатами и историю сообщений.- Обработчик Медиа: Обрабатывает загрузку файлов. После обработки файла он отправляет уведомление обратно в этот сервис чата, чтобы информировать пользователей в комнате.
- Чат на основе комнат: Создание новых комнат, присоединение к существующим по коду-приглашению и просмотр списка своих комнат.
- Обмен сообщениями в реальном времени: Мгновенная доставка сообщений всем подключенным участникам комнаты с помощью WebSockets.
- Статус сообщений: Включает подтверждение о доставке (
✓) и прочтении (✓✓). - История и синхронизация: Загружает недавнюю историю сообщений при подключении и позволяет клиентам запрашивать пропущенные сообщения после переподключения.
- Внутренний API для уведомлений: Внутренний ендпоинт для других сервисов (например,
media-processor) для отправки системных сообщений в чат.
- Язык: Go
- Фреймворк API: Gin для HTTP-сервера.
- Связь в реальном времени: Gorilla WebSocket.
- База данных: PostgreSQL, с доступом через драйвер pgx/v5.
- Межсервисная коммуникация: gRPC для вызовов аутентификации в
auth-service. - Логирование:
slog(стандартная библиотека) для структурированного логирования. - Наблюдаемость (Observability) и Хранение:
- Prometheus: Предоставляет ендпоинт
/metricsдля сбора метрик приложения. - Jaeger: Интегрирован для распределенной трассировки, что позволяет отслеживать запросы между всеми микросервисами.
- MinIO: Используется как S3-совместимое объектное хранилище для всех загружаемых пользователями медиафайлов, управляется сервисом
media-processor.
- Prometheus: Предоставляет ендпоинт
Все ендпоинты имеют префикс /api/v1.
| Метод | Ендпоинт | Описание |
|---|---|---|
POST |
/rooms |
Создает новую чат-комнату. |
POST |
/rooms/join |
Присоединяет пользователя к комнате по коду-приглашению. |
GET |
/rooms |
Получает список всех комнат, в которых состоит пользователь. |
POST |
/internal/notify |
Только для внутреннего использования. Позволяет другим сервисам отправлять уведомления. |
GET /ws/:roomId?token=<access_token>- Инициирует WebSocket-соединение с чат-комнатой.
Самый простой и рекомендуемый способ запустить весь проект — использовать Docker Compose. Эта команда запустит этот сервис, его базу данных и все остальные связанные сервисы, включая Prometheus и Jaeger.
- Перейдите в корневой каталог проекта.
- Выполните команду:
docker compose up --build
- Интерфейс Jaeger: Доступен по адресу
http://localhost:16686 - Интерфейс Prometheus: Доступен по адресу
http://localhost:9090
-
Требования:
- Установленный Go 1.24+.
- Запущенный экземпляр PostgreSQL.
- Запущенный экземпляр
auth-service.
-
Настройте окружение: Создайте файл
.envв каталогеchat-app:# Порт для HTTP и WebSocket-сервера API_PORT=8080 # Строка подключения к вашей базе данных PostgreSQL DB_URL=postgres://user:password@localhost:5432/chat_db?sslmode=disable # Адрес gRPC-сервера запущенного auth-service AUTH_SERVICE_ADDR=localhost:50001 # Адрес gRPC-ендпоинта Jaeger OTLP JAEGER_URL=localhost:4317 # Секретный ключ для защиты внутреннего API уведомлений INTERNAL_API_KEY=your-internal-api-key
-
Запустите сервис:
go run ./cmd/api/main.go