- Go
- Docker: Docker используется для деплоя сервисов с помощью
docker-compose
. - Компилятор Protobuf (protoc): Необходим для генерации Go-кода из
.proto
файлов.
Параметры подключения к базе данных и другие настройки могут быть заданы через переменные окружения или флаги командной строки.
--api-url
: URL API источника данных.--grpc-port
: Порт GRPC сервера.--log-level
: Уровень логирования.--pg-host
: Хост PostgreSQL.--pg-user
: Пользователь PostgreSQL.--pg-password
: Пароль PostgreSQL.--pg-user-admin
: Административный пользователь PostgreSQL.--pg-password-admin
: Административный пароль PostgreSQL.--pg-database
: Имя базы данных PostgreSQL.--otel-endpoint
: Эндпоинт для OpenTelemetry.
Пример запуска с использованием флагов командной строки:
./usdt-rate-service --api-url="https://garantex.org/api/v2/depth?market=usdtrub" --pg-host="localhost:5432"
Проект также может использовать переменные окружения для конфигурации различных сервисов. Шаблонный файл переменных окружения предоставлен как .env.example
. Перед запуском проекта необходимо создать файл .env
и заполнить его реальными значениями.
-
Скопируйте файл
.env.example
:cp .env .env
-
Отредактируйте файл
.env
и замените значения переменных на реальные:API_URL="https://garantex.org/api/v2/depth?market=usdtrub" # Адрес API получения котировок GRPC_PORT=50051 # Порт для gRPC сервера LOG_LEVEL=debug # Уровень логирования (например, debug, info, warn, error) PG_HOST=localhost:5432 # Адрес и порт для подключения к PostgreSQL PG_USER=template_service # Имя пользователя PostgreSQL для основного подключения PG_PASSWORD=template_service # Пароль для основного пользователя PostgreSQL PG_USER_ADMIN=template_service # Имя администратора PostgreSQL (если отличается) PG_PASSWORD_ADMIN=template_service # Пароль администратора PostgreSQL PG_DATABASE=template_service # Имя базы данных PostgreSQL OTEL_ENDPOINT=jaeger:4317 # Jaeger как endpoint для OpenTelemetry
Проект организован по следующим директориям:
Содержит скомпилированные бинарные файлы инструментов, установленных с помощью make
задач. Эта директория создаётся автоматически при выполнении задачи make tools-install
или make build
.
Содержит точку входа в приложение — файл service/main.go
. Здесь определяется основной запуск сервиса.
service/main.go
: Главный файл, отвечающий за запуск и конфигурацию приложения.root.go
: Файл предоставляет возможность выбора настройки конфигурации подключения к БД либо через флаги командной строки, либо через переменные окружения.
Содержит файлы конфигурации проекта.
config.go
: Здесь определяется структура конфигурационных данных и логика их загрузки.
Содержит файлы, связанные с базой данных.
migrations/
: Содержит SQL файлы миграций базы данных. Например,20250305083034_create_exchange_rates_table.sql
создаёт таблицу для хранения данных о котировках.
Содержит файлы, связанные с деплоем приложения с помощью Docker.
docker-compose/
:docker-compose.yaml
: Конфигурация для запуска сервисов через Docker Compose.Dockerfile
: Файл для сборки Docker-образа приложения.
grafana/
: Настройки для работы с Grafanaprometheus/
: Настройки для работы с Prometheus
Содержит основные пакеты сервиса, которые не должны быть доступны извне.
-
application
: Слой приложения: Включает компоненты, которые управляют основной логикой приложения, такие как обработчики запросов, контроллеры, или реализации сервисов.Примеры:
- grpc/ - Реализация gRPC серверов, обработчиков запросов и взаимодействие с бизнес-логикой.
-
domain
: Бизнес-логика и сущности домена: В этом слое определяются основные бизнес-сущности. Эти компоненты обычно независимы от внешних технологий и фреймворков.Примеры:
- entity/ - Определение доменных сущностей.
- usecase/ - Реализация бизнес-логики и сценариев использования (Use Cases), которые определяют, как сущности взаимодействуют друг с другом.
-
generated
: Содержит автоматически сгенерированный код. -
infrastructure
: Слой инфраструктуры: Компоненты, которые взаимодействуют с внешними системами, такими как базы данных, очереди сообщений, файловые системы и внешние API. Примеры:- repository/ - Реализации репозиториев для доступа к данным, например, работа с базой данных или кэшированием.
- api_clients/ - Взаимодействие с внешними API, сторонними сервисами и т.д.
Содержит вспомогательные пакеты, которые могут быть использованы в различных частях приложения.
Содержит исходные файлы .proto
для генерации gRPC и Protobuf кода.
.env
: Файл с переменными окружения, используемыми приложением..gitignore
: Содержит списки файлов и директорий, которые должны быть проигнорированы Git..golangci.yml
: Конфигурация для линтинга кода с помощью golangci-lint..mockery.yaml
: Конфигурация для генерации мок-объектов с помощью Mockery.go.mod
: Модуль Go, описывающий зависимости проекта.Makefile
: Makefile, содержащий задачи для автоматизации разработки.
Проект использует "Makefile" для автоматизации общих задач. Ниже приводится краткое описание доступных задач.
Установка необходимых инструментов для линтинга, форматирования и генерации кода.
make tools-install
Этот таск установит следующие инструменты:
golangci-lint
goimports
gofumpt
protoc-gen-go
protoc-gen-go-grpc
mockery
Обеспечивает актуальность и чистоту файла go.mod
.
make go-tidy
Этот таск выполняет go mod tidy
и go get
для обновления зависимостей и удаления ненужных.
Запуск статического анализа кода для выявления общих проблем и повышения качества кода.
make lint
Этот таск использует golangci-lint
для анализа кода и автоматического исправления проблем, где это возможно.
Форматирование кода для поддержания консистентности.
make fmt
Этот таск запускает следующие инструменты форматирования:
go fmt
для стандартного форматирования Go.gofumpt
для более строгого форматирования.goimports
для упорядочивания импортов.
Сборка бинарного файла
make build
Этот таск запускает следующие задачи:
mkdir -p bin
для создания папки bin, если она не существуетgo build
для сборки бинарного файла
Запускает тесты для всего проекта
make test
Генерация Go-кода и Protobuf-кода из исходных файлов.
make generate
Этот таск запускает следующие подзадачи:
generate-go
: Выполняетgo generate ./...
для генерации Go-кода.generate-proto
: Компилирует.proto
файлы в Go и gRPC код.fmt
: Форматирование кода.
Деплой приложения с использованием Docker Compose.
make docker-run
Этот таск запускает все Docker-сервисы, определённые в файле docker-compose
.
Чтобы остановить приложение через docker-compose выполните команду:
make docker-down
Чтобы развернуть только инфраструктурные сервисы (например, PostgreSQL), выполните:
make docker-infra
Чтобы применить миграции выполните команду:
make migrate-up
Чтобы откатить миграции выполните команду:
make migrate-down
Чтобы удалить все скомпилированные файлы выполните:
make clean
Этот таск запускает следующие подзадачи:
clean-bin
: Удаляет скомпилированный бинарный файл приложения.clean-proto
: Удаляет скомпилированые.proto
файлы.
- Настройка переменных окружения: Скопируйте файл
.env.example
в.env
и заполните его реальными значениями. - Установка инструментов: Выполните
make tools-install
для установки всех необходимых инструментов. - Приведение в порядок Go-модулей: Выполните
make go-tidy
для обновления зависимостей. - Генерация кода: Выполните
make generate
для генерации всего необходимого кода. - Линтинг и форматирование: Выполните
make lint
иmake fmt
для очистки и форматирования кода. - Деплой: Выполните
make docker-run
илиmake docker-infra
.