Архитектура

Приложение разделено по ограниченым контекстам на микросервисы. В ветке part_1 можно увидеть как на начальном этапе приложение было модульным монолитом.

Каждый микросервис реалзиован по принципу чистой архитектуры (Clean Architecture), бизнес-логика реализована паттернами Domain-Driven Design'а (Aggregates, Entities, Value Object, Domain Services). За структурой проекта следит ArchUnit.

На данный момент СУБД используется только для одного агрегата, все остальное есть InMemory-реализация хранилищ.

Также мы постарались реализовать принцип кричащей архитектуры (Screaming Architecture). Структура проекта отражает назначение проекта и функциональность, тоже самое касается пакетов и даже отдельных файлов

Решения о важных архитектурных решениях содержатся в Architecture Decision Records

Инфраструктура

Continuous integration

Основная идея - разработчику должно быть максимально удобно работать за локальным компьютером. Поэтому все необходимые действия с проектом можно совершить нажатием одной "кнопки", которые находятся в tools/scripts. Таким образом в полной мере реализуем концепцию CI. В качестве предохранителя используется GitHubActions. В случае падения сборки в артефакте reports есть вся необходимая информация для диагностики. Для пуша можно установить pre-push hook, который будет прогонять всю сборку целиком перед заливкой в репозиторий.

Сборка

Помимо простой компиляции и подготовки образа, в проекте используются дополнительные инструменты, результат работы которых также влияет на успех или неуспех сборки.

  • Статанализатор detekt
  • Линтер - ktlint, (как плагин к detekt)
  • Контроль тестового покрытия JaCoCo
  • Поиск уязвимых зависимотей OWASP DependencyCheck
  • Поиск новых версий для зависимостей
  • Контроль отсутствия предупреждений компилятора

Зависимости перечислены в ProjectDependencies.kt

Запуск

"Кнопками" из tools/scripts можно разворачивать и останавливать кластер на рабочей машине разработчка без необходимости занимать стенды.

Тесты

Пирамида тестов, реализованая в проекте

  • Юнит-тесты
  • Интеграционные тесты
    • Тестирование репозиториев
    • Тестирование клиентов к внешним сервисам
  • Контрактные тесты Pact.io
  • Компонентные тесты
  • Сквозные тесты kbdd + Allure
  • Тесты структуры проекта ArchUnit
  • Мутационные тесты PiTest
  • Нагрузочные тесты Gatling

Взаимодействие с внешним миром

В примере реализованы примеры

Event storming

Miro board

Мониторинг

In Progress

Конфигурация

In Progress

Безопасность

In Progress

Ставьте звезды и приходите к нам в Телеграм-канал