📄️ Структура backend сервиса на языке Go
Сервисы Ensi на Go строятся на Goravel и сохраняют те же организационные цели, что и PHP-сервисы:
📄️ Рекомендации к написанию автотестов
Перед началом следует ознакомиться с Autotests Guide.
📄️ Генератор кода ensi-gog
В Go-сервисах Ensi контракт HTTP API задаётся OpenAPI-спецификацией (как и в PHP-сервисах на Laravel). Чтобы не поддерживать роуты, DTO и заготовки хэндлеров вручную, используется CLI ensi-gog — генератор из репозитория goravel-openapi-generator.
📄️ HTTP-ответы и ошибки
Все публичные эндпоинты Go-сервисов Ensi отдают JSON в одном формате. Формировать его вручную через ctx.Response().Json(...) в хэндлерах не нужно: для успеха и ошибок есть хелперы в пакете app/common/http (в коде обычно импортируют как commonhttp).
📄️ Работа с базой данных
В Go-сервисах Ensi доступ к PostgreSQL идёт через ORM Goravel (facades.Orm()). Модели и их тестовые фабрики живут в инфраструктурном пакете app/adapters/db, а схема — в database/migrations. Правила именования таблиц и столбцов общие для платформы — см. Database Design Guide.
📄️ Работа с Kafka
В Go-сервисах Ensi Kafka используется для обмена событиями между сервисами. Типичные сценарии такие: мастер-система опубликовала оффер или изменила бренд, маркетинговый сервис отправил команду пересчитать скидки, ваш сервис должен подхватить изменение и обновить локальный кэш или индекс. Вы либо публикуете сообщение в топик, либо подписываетесь на топик и обрабатываете входящий поток, либо делаете и то и другое.
📄️ Работа с очередями
Очереди нужны, когда работу не стоит выполнять в том же HTTP-запросе или artisan-команде, в которых она возникла. Типичные случаи — долгий пересчёт, пакетная миграция данных из мастер-сервисов, тяжёлое обращение к внешнему API, индексация пачки сущностей. Вы кладёте задачу в очередь и сразу возвращаете управление вызывающему коду; отдельный воркер позже подхватывает задачу и выполняет её в своём процессе.
📄️ Работа с пакетами
В Go-сервисах Ensi зависимости проекта описываются файлами go.mod и go.sum в корне репозитория. Это аналог composer.json / composer.lock в PHP-мире, но с важными отличиями в модели версий и в том, как принято подключать локальные правки чужих модулей.
📄️ Prometheus-метрики
Go-сервисы Ensi отдают метрики производительности в формате Prometheus, в той же идеологии, что и PHP-сервисы на пакетах laravel-metrics / laravel-prometheus. Имена основных HTTP-метрик совместимы с платформенным дашбордом, поэтому один и тот же scrape и те же запросы в Grafana в целом применимы и к Go.
📄️ Логирование
Go-сервисы Ensi пишут логи через штатный Log-фасад Goravel (facades.Log()), а доставку в Elasticsearch и формат документов, совместимый с индексами платформы, обеспечивает адаптер в app/adapters/logging. По смыслу это тот же стек, что и в PHP (каналы, уровни, файлы + централизованный поиск), только без Monolog: каналы описаны в config/logging.go, а custom-драйвер elastic / elastic_access буферизует документы и отправляет их bulk-запросом.
📄️ Настройка GoLand
Обычный elc start поднимает контейнер, внутри которого работает air: он перекомпилирует и перезапускает сервис при изменении кода. В таком режиме удобно жить день за днём, но отладчик GoLand к процессу не подключить. Ниже — как завести отдельные конфигурации Run/Debug через Docker Compose, гонять тесты и при необходимости возвращаться к elc start одной кнопкой.