docs/architecture/golang/README.md

100 lines
8.5 KiB
Markdown
Raw Permalink Normal View History

2023-01-03 09:08:58 +00:00
# Архитектура сервиса/микросервиса на Golang
## Основа:
```
├── cmd - Основные приложения проекта
├── deployments - Директория для деплоя сервиса
2023-06-19 20:18:11 +00:00
├── docs - Директория с документацией
2023-01-03 09:08:58 +00:00
├── internal - Директория с внутренним кодом приложения
2023-06-19 20:18:11 +00:00
├── migrations - Директория с миграциями изменений БД
2023-12-04 15:09:31 +00:00
├── pkg - Директория с общими пакетами приложения - пакеты общие между доменами выносим в common, общее в рамках домена - в pkg
2023-06-19 20:18:11 +00:00
├── proto - Директория с описанием прототипа интерфейса gRPC
├── tests - Директория с тестами проекта (integration/e2e)
├── .dockerignore - Файл для перечисления игнорирования докером файлов/директорий
├── .gitignore - Файл для перечисления игнорирования гитом файлов/директорий
2023-01-03 09:08:58 +00:00
├── .gitlab-ci.yml - Файл настройки Gitlab CI
2023-12-27 21:37:48 +00:00
├── .mockery.yaml - Файл настройки пакета mockery для генерации моков на Golang. используем для внешних зависимостей или пустых сервисов
2023-01-03 09:08:58 +00:00
├── go.mod - Корень управления зависимостями в GoLang
├── go.sum - Файл содержащий хеши для нескольких версий модуля
2023-12-27 21:37:48 +00:00
├── Taskfile.yml - Набор команд go-task
2023-06-19 20:18:11 +00:00
├── README.md - Общий файл документации (путеводитель)
2023-01-03 09:08:58 +00:00
```
## Структура `/cmd`:
```
2023-12-27 21:37:48 +00:00
├── main.go - Точка входа в приложение
├── Dockerfile - Файл контейнеризации сервиса -- проверить возможность скопировать из корня проекта
2023-01-03 09:08:58 +00:00
```
## Структура `/docs`:
```
├── [group] - Группа документации
│ ├── README.md - Файл документации
2023-12-04 15:09:31 +00:00
├── openapi.yaml - Файл описания REST документации в формате OpenAPI (swagger)
2023-01-03 09:08:58 +00:00
```
## Структура `/internal`:
2023-06-19 20:18:11 +00:00
Здесь хранится внутренний код приложения и библиотек. Это код, который не должен быть применен в других приложениях и библиотеках. Стоит отметить, что этот шаблон использования internal навязан самим компилятором Golang. Ознакомьтесь с release notes Go 1.4. Также, вы вольны использовать internal директорию на разных уровнях своего проекта.
2023-01-03 09:08:58 +00:00
```
2023-06-19 20:18:11 +00:00
├── app - Пакет приложения
│ ├── [app name].go - Приложение
2023-12-04 15:09:31 +00:00
├── errors - Пакет для обработки и создания ошибок приложения (желательно вынести в pkg) -- 2 common, вынести как категоризатор ошибок и действий о них
2023-06-19 20:18:11 +00:00
├── initialize - Пакет для инициализации модулей (контроллеров, репозиториев, клиентов)
2023-12-04 15:09:31 +00:00
├── adapters - Данная директория хранит адаптеры для взаимодействия с внешними сервисами
2023-06-19 20:18:11 +00:00
│ ├── client - Пакет клиента для взаимодействия с другими приложениями (REST, gRPC)
2023-06-19 20:19:53 +00:00
│ │ ├── [name].go - Сам клиент
2023-12-27 21:37:48 +00:00
├── repository - Директория репозиториев для взаимодействия с базой данных, если есть набор отдельных баз, то делаем отдельные подкаталоги
2023-12-04 15:09:31 +00:00
│ ├── [name].go - Файл репозитория (user.go)
├── controller - Директория контроллеров
│ ├── [name] - Директория контроллера
│ │ ├── [name].go - Сам контроллер. Хранит в себе обработчики внешних запросов
│ │ ├── [name]_test.go - Файл тестов для контроллера
2023-06-19 20:18:11 +00:00
├── models - Пакет моделей данных
│ ├── [name].go - Файл структур, которые относятся к определённой модели (user.go)
├── proto - Директория, содержащая сгенерированные proto файлы
2023-12-04 15:09:31 +00:00
├── server - Пакет хранящий инициализации серверов (http/tcp/grpc) -- 2 common
2023-06-19 20:18:11 +00:00
│ ├── [name].go - Файл инициализации сервера (http/tcp/grpc)
2023-12-04 15:09:31 +00:00
├── services - Пакет слоя бизнес логики
├── utils - Пакет внутренних функций/утилит приложения - не больше одного уровня вложенности
2023-06-19 20:18:11 +00:00
│ ├── [name].go - Утилита
│ ├── [name]_test.go - Тесты утилиты
├── worker - Пакет, для запуска и инициализации воркеров
│ ├── [name] - Пакет воркера
2023-06-19 20:21:00 +00:00
│ │ ├── mocks - Пакет, содержащий сегенированные моки для воркера
2023-06-19 20:19:53 +00:00
│ │ ├── [name].go - Файл воркера
│ │ ├── [name]_test.go - Файл тестов воркера
2023-06-19 20:18:11 +00:00
│ ├── run.go - Файл запуска воркеров
2023-01-03 09:08:58 +00:00
```
2023-12-04 15:09:31 +00:00
config? app
2023-01-03 09:08:58 +00:00
## Структура `/pkg`:
Код библиотек, пригодных для использования в сторонних приложениях. (например, `/pkg/mypubliclib`). Другие проекты будут импортировать эти библиотеки, ожидая их автономной работы, поэтому стоит подумать дважды, прежде чем класть сюда какой-нибудь код. Использование директории `internal` - более оптимальный способ не дать импортировать внутренние пакеты, потому что это обеспечит сам `Golang`. Директория `/pkg` - всё еще хороший путь дать понять, что код в этой директории могут безопасно использовать другие.
Код из директории `/pkg` желательно в будущем выносить в отдельный репозиторий общих пакетов.
```
├── utils - Пакет утилит, доступные разным приложениям
│ ├── [name].go - Утилита
```
## Тесты:
В каждом пакете присутствует файл, хранящий выполняемый код, рядом с этим файлом должен находится файл тестов, которые будет содержать имя этого файла и постфикс `_test`.
```
2023-06-19 20:18:11 +00:00
│ controller - Директория контроллеров
│ ├── [name] - Пакет контроллера
2023-06-19 20:19:53 +00:00
│ │ ├── mocks - Пакет сгенерированных моков для тестов контроллера
│ │ ├── [name].go - Сам контроллер
│ │ ├── [name]_test.go - Файл тестов контроллера
2023-01-03 09:08:58 +00:00
├── utils - Пакет внутренних функций/утилит приложения
│ ├── [name].go - Утилита
│ ├── [name]_test.go - Файл тестов утилиты
```