Skip to content
KovalyovvPublic

About

Сервис чата с поддержкой WebSockets, gRPC соединение с сервисом авторизации. На этапе mvp.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

39 Commits

Folders and files

Repository files navigation

Сервис Чата в Реальном Времени (chat-app)

Go Version License: MIT

Этот проект является бэкендом для приложения-чата, основанного на комнатах и работающего в реальном времени. Он создан на 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.

API Endpoints

Все ендпоинты имеют префикс /api/v1.

HTTP API

Метод Ендпоинт Описание
POST /rooms Создает новую чат-комнату.
POST /rooms/join Присоединяет пользователя к комнате по коду-приглашению.
GET /rooms Получает список всех комнат, в которых состоит пользователь.
POST /internal/notify Только для внутреннего использования. Позволяет другим сервисам отправлять уведомления.

WebSocket API

  • GET /ws/:roomId?token=<access_token>
    • Инициирует WebSocket-соединение с чат-комнатой.

Как Запустить

Рекомендуемый Способ: Docker Compose

Самый простой и рекомендуемый способ запустить весь проект — использовать Docker Compose. Эта команда запустит этот сервис, его базу данных и все остальные связанные сервисы, включая Prometheus и Jaeger.

  1. Перейдите в корневой каталог проекта.
  2. Выполните команду:
    docker compose up --build
  • Интерфейс Jaeger: Доступен по адресу http://localhost:16686
  • Интерфейс Prometheus: Доступен по адресу http://localhost:9090

Локальная Разработка (Альтернатива)

  1. Требования:

    • Установленный Go 1.24+.
    • Запущенный экземпляр PostgreSQL.
    • Запущенный экземпляр auth-service.
  2. Настройте окружение: Создайте файл .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
  3. Запустите сервис:

    go run ./cmd/api/main.go

About

Сервис чата с поддержкой WebSockets, gRPC соединение с сервисом авторизации. На этапе mvp.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages