83 lines
6.2 KiB
Markdown
83 lines
6.2 KiB
Markdown
![]() |
# Архитектура сервиса/микросервиса на 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 - Файл тестов утилиты
|
|||
|
```
|