Шаблон проектов для микросервисов Masterdelivery

Шаблон основан на соглашениях, принятых в документе тандарты разработки. Реализован и запускается при помощи утилиты Cookiecutter.

Использование

pip install --user cookiecutter
cookiecutter git@gitlab.masterdelivery.ru:backend/base-template.git

Дальше можно смотреть инструкции и описание в README.md созданного проекта.

Структура:

@todo

Архитектура

В основе лежит некая вариация концепции «чистой архитектуры» в представлении слоистости, с адаптацией под наши привычки и особенности. Так же, при проектировании вдохновлялся находками из (fastapi-layered-architecture)[https://github.com/teamhide/fastapi-layered-architecture]. Базая структура выглядит следующим образом:

  • core — ядро, системные вызовы, коннекторы, настройки, не предметно-ориентированный код, а уровень инфраструктуры
  • domain — предметная область приложения, ключевая часть приложения, где сосредоточеная вся бизнес-логика и взаимодействие с данными
  • api — presentation слой, собственно сам api/swagger интерфейс

domain в свою очередь, состоит из следующих структур:

  • models — доменные сущности: таблицы в БД
  • repositories — коллекции данных, некий стандартизированный интерфейс работы с сущностями, тут не сосредоточена логика, тут есть только относительно тривиальные операции ввода/вывода
  • schemas — pydantic-схемы, интерфейсы между всеми компонентами
  • interactors — это сердце приложения, бизнес-логика, где происходит работа с сущностями/репозиториями, валидации/запись/сохранение и так далее, они инжектят в себя репозитории и взаимодействют с ними. Они реализуют use case. Сюда же относится и взаимодействие с внешними сервисами.

В свою очередь interactors реализованы по паттерну CQRS, и предполагают, что разные сервисы будут отвечать за чтение и запись данных (отделение command от query).

Вкратце, получается такая схема:

  • api взаимодействует с interactors
  • interactors реализуют логику и взаимодействуют с repositories по контрактам из schemas
  • repositories взаимодействует с хранилищами (postgres/redis) по контрактам из schemas, используя models и возвращают данные

Обновление зависимостей

Разработка

Общее todo

[] Запустить основные ручки [] Прикрутить редис (с учетом правильного подключения) [] Прикрутить БД, Джино, алембик, протестить работу миграций [] Подключить arq-очередь [] Добавить background tasks [] Сделать кронджобу [] Сделать простые тесты и запустить их [] Прикрутить кафку [] Подключить Vault [] Настроить логгинг, пропатчить либу, чтобы инит туда положить [] Рассмотреть вопрос работы с редисом через либу [] Рассмотреть вопрос работы с редисом через модели [] Именование топиков в кафке включить в стандарты разработки [] Именование проектов включить в стандарты разработки [] Переделать на copier https://github.com/copier-org/copier [] black в опцию

Мысли и вопросы

[] Разобраться в разнице между DAL и репозиторием (наш кейс - это скорее дал), формализовать работу с репозиторием, выделить критерии (создание - в моделе, логика - с сервисах) []