Введение в архитектуру Go-сервисов

Этот модуль про то, как удерживать проект понятным, когда файлов становится много, зависимостей больше одной, а требования начинают меняться. Архитектура здесь не про красивые схемы, а про стоимость изменений.

В Go архитектурные подходы обычно выглядят проще, чем в Java-мире: меньше наследования, больше явных интерфейсов, пакетов и функций. Но простота не отменяет дисциплину. Если границы не обозначены, бизнес-логика быстро смешивается с HTTP, базой, очередями и случайными деталями инфраструктуры.


Что будет внутри

  • layered architecture как базовая точка отсчёта;
  • hexagonal и onion architecture: ports, adapters, направление зависимостей;
  • Clean Architecture и практическая раскладка по пакетам;
  • сравнение подходов без попытки выбрать один навсегда;
  • DDD: язык предметной области, entities, value objects, aggregates;
  • паттерны, которые в Go действительно встречаются в живом коде.

Как теория связана с проектом RateDesk

Теоретические уроки разбирают архитектурные решения отдельно: layered, ports/adapters, use cases, DDD, aggregates, patterns. Практическая сборка этих решений живёт в отдельном проектном треке RateDesk, особенно на этапе Architecture.

Поэтому в уроках ниже будут короткие production-примеры и анти-примеры, а не полноценные проектные задания. Детальные issue, acceptance criteria, MR-план, ADR и review checklist должны жить в проекте, где студент реально меняет код.

Связка простая:

  • в теории студент понимает правило и видит небольшой пример;
  • в RateDesk применяет правило к ConvertAmount, rate provider, repository boundary, config, idempotency и outbox;
  • на review проверяет не «похожесть на Clean Architecture», а конкретные свойства: нет циклов импортов, use case тестируется без БД, домен не знает про pgx, echo, Redis, Kafka и внешние SDK.

Как понять, что модуль освоен

Вы можете объяснить, почему один пакет зависит от другого, где живёт бизнес-правило и что нужно изменить при замене базы, HTTP-фреймворка или внешнего клиента. Вы не создаёте слои ради слоёв, но и не складываете всё в один handler.

Главный результат: вы умеете выбирать структуру под размер задачи. Маленькому сервису не нужна тяжёлая церемония, большому сервису опасно жить без границ.


Рабочие ориентиры

  • Архитектура должна защищать важные правила от деталей доставки и хранения.
  • Интерфейс обычно объявляет потребитель, а не поставщик.
  • Чем дороже изменение, тем явнее должна быть граница вокруг него.