The Best Musical Service
© Team Wave
Team:
Backend
Бекенд
Архитектура
В основе архитектуры лежит "чистая архитектуры Дяди Боба" с применением
микросервисов на gRPC. В проекте присутствует разделение на следующие слои:
- доставка (delivery)
- бизнес-логика (useCase)
- агент (agent)
- сервис (gRPC)
- репозиторий (repository)
Каждый слой включает в себя один уровень ниже. Каждый слой не должен включать в себя слой выше или слой из этого же
уровня. Данный подход позволяет относительно недорого масштабироваться и уменьшает стоимость внедрения новых
возможностей сервиса. Новым разработчикам достаточно следовать этому паттерну, что позволяет им быстро вкатиться в
разработку.
Схема:
Примечание: в нашем проекте добавлены слои агентов и gRPC. Агент - это посредник между бизнес-логикой и самим сервисом.
Эта сущность инкапсулирует особенности обращения к gRPC (сигнатуру вызываемых методов сервиса).
gRPC
В проекте есть следующие сервисы-gRPC:
- альбом (album)
- артист (artist)
- трек (track)
- плейлист (playlist)
- пользователь (user)
- аутентификация (auth)
- сокращатель ссылок (linker)
- веб-сокет сервер для синхронизации между устройствами (websocket)
Сервер
Для серверной разработки используем легковесный и быстрый Echo. Для прокси
настроили nginx.
Основная база
Подключили Postgres
Хранение сессий пользователей
Юзаем ин-мемори хранилище данных Redis
Хранение ссылок
Развернули документоориентированную систему MongoDB
Docker
Под каждый сервис собран легковесный docker-образ (в основном
на Ubuntu)
CI/CD
Развернули кластер на K8S. Используем
встроенный Github Actions для автодеплоя на кластер. На кластере находятся все
компоненты приложения за исключением постгриса и монги (они на другой тачке). Все образы подгружаются с
нашего dockerHub.
Метрики и алерты
К каждому сервису ходит Prometheus для сбора метрик.
Настроили Alertmanager с алертингом в телеграм для
оповещении о состоянии сервисов. А в оценке происходящего с дашбордов нам помогает Grafana.
Документация
Сбилдили удобную доку через swagger
Summary
В проекте 20116 строчек go-кода (01.06.2022 22:15 GMT+3)