docs/architecture/golang/README.md
2023-01-03 12:08:58 +03:00

6.2 KiB
Raw Blame History

Архитектура сервиса/микросервиса на 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     - Файл тестов утилиты