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

83 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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