Итог
Вы прошли все три слоя. Вот как выглядит готовый проект.
Структура проекта
project/
├── cmd/
│ ├── main/ — точка входа, инициализация, lifecycle
│ └── apps/
│ ├── main.go — Configs, Init, Exec
│ ├── interface.go — интерфейс App
│ ├── http_server/ — HTTP-сервер
│ └── pubsub_consumer/ — consumer
│
├── internal/
│ ├── delivery/
│ │ ├── endpoints/ — HTTP handlers
│ │ ├── consumers/ — consumer handlers
│ │ └── events/ — eventbus handlers
│ ├── models/ — сущности предметной области
│ └── utils/ — вспомогательные функции
│
├── pkg/
│ ├── services/ — singleton-обёртки над внешними системами
│ ├── infra/ — логирование, трейсинг, eventbus, vars
│ └── libs/ — переиспользуемые строительные блоки
│
├── configs/
│ ├── configs.json
│ ├── dev.json
│ └── prod.json
│
├── migrations/ — допустимо
├── scripts/ — допустимо
└── deployments/ — допустимоВесь код приложения живёт внутри трёх слоёв. Остальные папки — на усмотрение разработчика.
Как всё связано
При входящем запросе:
Запрос
↓
App (Engine) принимает запрос, передаёт в Delivery
↓
Delivery (Realm) выполняет бизнес-логику, вызывает Services
↓
Services (Toolkit) работает с технологией — БД, очередь, API
↓
Ответ
↑
App получает результат, переводит на язык протоколаКаждый слой знает только своё
| Слой | Знает | Не знает |
|---|---|---|
| Toolkit | как работать с технологией | что делает бизнес |
| Realm | что делать при запросе | как работает транспорт |
| Engine | когда передать управление | что делает бизнес |
Куда положить код
Когда не знаешь куда положить код — ответь на три вопроса:
- Это обёртка над внешней технологией? →
pkg/services - Это инструмент самого проекта (логгер, трейсер)? →
pkg/infra - Это бизнес-логика — что делать при запросе? →
internal/delivery - Это структура данных проекта? →
internal/models - Это запуск или оркестрация? →
cmd/