Skip to content

Итог

Вы прошли все три слоя. Вот как выглядит готовый проект.


Структура проекта

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когда передать управлениечто делает бизнес

Куда положить код

Когда не знаешь куда положить код — ответь на три вопроса:

  1. Это обёртка над внешней технологией?pkg/services
  2. Это инструмент самого проекта (логгер, трейсер)? → pkg/infra
  3. Это бизнес-логика — что делать при запросе?internal/delivery
  4. Это структура данных проекта?internal/models
  5. Это запуск или оркестрация?cmd/