Основа
База
Проект написан на Golang.
Основан на фреймворке go-kratos.
Фреймворк создан для создания микросервисов и используется для быстрой разработке с уже проверенными техническими решениями.
О зависимостях проекта можно сделать вывод по файлам:
configs/config.yaml— публичная часть текущей конфигурации сервиса,go.mod— используемые golang-библиотеки,api/domain/notification/v1/notification.proto— используемые методы сервиса notifications.
Интерфейсы
Сервис предоставляет API с помощью:
- GRPC-методов по порту 9000 (выставлен по умолчанию, может отличаться);
- HTTP-методов по порту 8000 (выставлен по умолчанию, может отличаться).
GRPC-методы и аналогичные HTTP-методы описаны в файлах:
api/domain/v1/*.proto
Также, есть автоматически генерируемая схема OpenAPI (Swagger):
openapi.yaml
Внешние зависимости
-
База данных
PostgreSQL— сервис во время запуска самостоятельно создаст или актуализирует сущности базы данных — саму базу, схему, таблицы, последовательности, индексы и данные. -
Сервис
notifications— используется для отправки уведомлений.
Внутренние зависимости
Основные используемые библиотеки:
entgo.io/ent— ORM и кодогенератор, используется для упрощения работ с репозиториями базы данных,github.com/gavv/httpexpect/v2— библиотека для функционального тестирования сервиса, позволяет запустить экземпляр сервиса и выполнить проверки API-методов,github.com/go-kratos/kratos/v2— непосредственно сам фреймворк Kratos,github.com/google/wire— инжектор зависимостей (dependency injection), облегчает внутреннюю сборку структур со множеством зависимостей,github.com/tidwall/gjson— парсер данных в формате JSON, сильно облегчает работу со сложными данными (на его базе создан пакетextractor).
Инфраструктурные зависимости
Сервис рассчитан на инфраструктурные решения, предлагаемые проектом infra:
- Docker Swarm — облегчённый оркестратор для контейнеров ("kubernetes на минималках"), позволяет запускать контейнеры с сервисами, управлять их работой и автоматически перезапускать их при проблемах,
- Traefik — сервисный роутер (edge router), облегчает работу с контейнерами в Docker Swarm и маршрутизацией запросов к ним (грубо говоря, в текущем проекте это "nginx для docker-контейнеров"),
- Portainer — сервис для управления Docker-контейнерами, представляет собой "инфраструктурную админку", в которой возможно настроить текущую конфигурацию Docker Swarm, развернуть/запустить/перезапустить/отключить контейнер, посмотреть его логи, подключиться к его терминалу и прочее, что значительно облегчает работу с контейнерами,
- Registry — хранилище docker-образов для сервисов, позволяет принимать собранные образы и предоставлять их для запуска внутри Docker Swarm,
- Grafana — проект для сбора и показа метрик, позволяет собирать произвольные метрики сервиса (через graphite), применять к его значениям алерты и рассылать их по заданным параметрам на почту или в мессенджер, помимо этого позволяет просматривать логи сервера/контейнеров и искать их по запросу (для этого используется связка loki + promtail).