# Архитектура сервиса/микросервиса на Golang ## Основа: ``` ├── cmd - Основные приложения проекта ├── deployments - Директория для деплоя сервиса ├── docs - Директория с документация ├── internal - Директория с внутренним кодом приложения ├── pkg - Директория с общими модулями приложения ├── .gitignore - Файл для перечисления игнорирования гита ├── .gitlab-ci.yml - Файл настройки Gitlab CI ├── Makefile - Набор команд ├── Dockerfile - Файл контейнеризации сервиса ├── README.md - Общий файл документации (путеводитель) ├── go.mod - Корень управления зависимостями в GoLang ├── go.sum - Файл содержащий хеши для нескольких версий модуля ``` ## Структура `/cmd`: ``` ├── [app name] - Название приложения (app) │ ├── main.go - Точка входа в приложение ``` ## Структура `/docs`: ``` ├── [group] - Группа документации │ ├── README.md - Файл документации ``` ## Структура `/internal`: Здесь хранится внутренний код приложения и библиотек. Это код, который не должен быть применен в других приложениях и библиотеках. Стоит отметить, что этот шаблон навязан самим компилятором Golang. Ознакомьтесь с release notes Go 1.4. Также, вы вольны использовать internal директорию на разных уровнях своего проекта. ``` ├── app - Пакет приложений │ ├── [app name].go - Приложение │ ├── [other helpers].go - Различные функции/утилиты для запуска приложений (graceful shutdown) ├── client - Пакет клиента для взаимодействия с другими сервисами │ ├── [name].go - Сам клиент │ controller - Пакет контроллеров для хранящий обработчики по каждому роуту │ ├── [name].go - Сам контроллер ├── errors - Пакет, хранящий обобщённые ошибки в отдельном файле │ ├── [name].go - Группа ошибок, например: ошибки репозитория (repository.go) ├── initialize - Пакет для инициализации разных сущностей (контроллеров, репозиториев, клиентов) │ ├── [name].go - Инициализция сущности, например: композита репозиториев (repository.go) ├── models - Пакет моделей данных │ ├── [name].go - Набор моделей, например: user.go ├── repository - Пакет репозиториев для взаимодействия с базой данных │ ├── [name].go - Методы репозитория, например: user.go ├── server - Пакет хранящий инициализации серверов (http/tcp/grpc) │ ├── [name].go - Файл инициализации сервера (http/tcp/grpc) ├── utils - Пакет внутренних функций/утилит приложения │ ├── [name].go - Утилита ``` ## Структура `/pkg`: Код библиотек, пригодных для использования в сторонних приложениях. (например, `/pkg/mypubliclib`). Другие проекты будут импортировать эти библиотеки, ожидая их автономной работы, поэтому стоит подумать дважды, прежде чем класть сюда какой-нибудь код. Использование директории `internal` - более оптимальный способ не дать импортировать внутренние пакеты, потому что это обеспечит сам `Golang`. Директория `/pkg` - всё еще хороший путь дать понять, что код в этой директории могут безопасно использовать другие. Код из директории `/pkg` желательно в будущем выносить в отдельный репозиторий общих пакетов. ``` ├── utils - Пакет утилит, доступные разным приложениям │ ├── [name].go - Утилита ``` ## Тесты: В каждом пакете присутствует файл, хранящий выполняемый код, рядом с этим файлом должен находится файл тестов, которые будет содержать имя этого файла и постфикс `_test`. ``` │ controller - Пакет контроллеров для хранящий обработчики по каждому роуту │ ├── [name].go - Сам контроллер │ ├── [name]_test.go - Файл тестов контроллера ├── utils - Пакет внутренних функций/утилит приложения │ ├── [name].go - Утилита │ ├── [name]_test.go - Файл тестов утилиты ```