Skip to content

anyuvo/usdt-rate-service

Repository files navigation

gRPC сервис на Go для получения курса USDT

Требования.

  • 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 и заполнить его реальными значениями.

Шаги:

  1. Скопируйте файл .env.example:

    cp .env .env
  2. Отредактируйте файл .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

Структура проекта

Проект организован по следующим директориям:

1. bin/

Содержит скомпилированные бинарные файлы инструментов, установленных с помощью make задач. Эта директория создаётся автоматически при выполнении задачи make tools-install или make build.

2. cmd/

Содержит точку входа в приложение — файл service/main.go. Здесь определяется основной запуск сервиса.

  • service/main.go: Главный файл, отвечающий за запуск и конфигурацию приложения.
  • root.go: Файл предоставляет возможность выбора настройки конфигурации подключения к БД либо через флаги командной строки, либо через переменные окружения.

3. config/

Содержит файлы конфигурации проекта.

  • config.go: Здесь определяется структура конфигурационных данных и логика их загрузки.

4. db/

Содержит файлы, связанные с базой данных.

  • migrations/: Содержит SQL файлы миграций базы данных. Например, 20250305083034_create_exchange_rates_table.sql создаёт таблицу для хранения данных о котировках.

5. deploy/

Содержит файлы, связанные с деплоем приложения с помощью Docker.

  • docker-compose/:
    • docker-compose.yaml: Конфигурация для запуска сервисов через Docker Compose.
    • Dockerfile: Файл для сборки Docker-образа приложения.
  • grafana/: Настройки для работы с Grafana
  • prometheus/: Настройки для работы с Prometheus

6. internal/

Содержит основные пакеты сервиса, которые не должны быть доступны извне.

  • application: Слой приложения: Включает компоненты, которые управляют основной логикой приложения, такие как обработчики запросов, контроллеры, или реализации сервисов.

    Примеры:

    • grpc/ - Реализация gRPC серверов, обработчиков запросов и взаимодействие с бизнес-логикой.
  • domain: Бизнес-логика и сущности домена: В этом слое определяются основные бизнес-сущности. Эти компоненты обычно независимы от внешних технологий и фреймворков.

    Примеры:

    • entity/ - Определение доменных сущностей.
    • usecase/ - Реализация бизнес-логики и сценариев использования (Use Cases), которые определяют, как сущности взаимодействуют друг с другом.
  • generated: Содержит автоматически сгенерированный код.

  • infrastructure: Слой инфраструктуры: Компоненты, которые взаимодействуют с внешними системами, такими как базы данных, очереди сообщений, файловые системы и внешние API. Примеры:

    • repository/ - Реализации репозиториев для доступа к данным, например, работа с базой данных или кэшированием.
    • api_clients/ - Взаимодействие с внешними API, сторонними сервисами и т.д.

7. pkg/

Содержит вспомогательные пакеты, которые могут быть использованы в различных частях приложения.

8. schemas/proto/

Содержит исходные файлы .proto для генерации gRPC и Protobuf кода.

9. Корневые файлы

  • .env: Файл с переменными окружения, используемыми приложением.
  • .gitignore: Содержит списки файлов и директорий, которые должны быть проигнорированы Git.
  • .golangci.yml: Конфигурация для линтинга кода с помощью golangci-lint.
  • .mockery.yaml: Конфигурация для генерации мок-объектов с помощью Mockery.
  • go.mod: Модуль Go, описывающий зависимости проекта.
  • Makefile: Makefile, содержащий задачи для автоматизации разработки.

Tasks

Проект использует "Makefile" для автоматизации общих задач. Ниже приводится краткое описание доступных задач.

1. Установка инструментов

Установка необходимых инструментов для линтинга, форматирования и генерации кода.

make tools-install

Этот таск установит следующие инструменты:

  • golangci-lint
  • goimports
  • gofumpt
  • protoc-gen-go
  • protoc-gen-go-grpc
  • mockery

2. Приведение в порядок Go-модулей

Обеспечивает актуальность и чистоту файла go.mod.

make go-tidy

Этот таск выполняет go mod tidy и go get для обновления зависимостей и удаления ненужных.

3. Линтинг

Запуск статического анализа кода для выявления общих проблем и повышения качества кода.

make lint

Этот таск использует golangci-lint для анализа кода и автоматического исправления проблем, где это возможно.

4. Форматирование

Форматирование кода для поддержания консистентности.

make fmt

Этот таск запускает следующие инструменты форматирования:

  • go fmt для стандартного форматирования Go.
  • gofumpt для более строгого форматирования.
  • goimports для упорядочивания импортов.

5. Сборка бинарного файла

Сборка бинарного файла

make build

Этот таск запускает следующие задачи:

  • mkdir -p bin для создания папки bin, если она не существует
  • go build для сборки бинарного файла

6. Запуск тестов

Запускает тесты для всего проекта

make test

7. Генерация кода

Генерация Go-кода и Protobuf-кода из исходных файлов.

make generate

Этот таск запускает следующие подзадачи:

  • generate-go: Выполняет go generate ./... для генерации Go-кода.
  • generate-proto: Компилирует .proto файлы в Go и gRPC код.
  • fmt : Форматирование кода.

8. Деплой

Деплой приложения с использованием Docker Compose.

make docker-run

Этот таск запускает все Docker-сервисы, определённые в файле docker-compose.

Чтобы остановить приложение через docker-compose выполните команду:

make docker-down

Деплой только инфраструктуры

Чтобы развернуть только инфраструктурные сервисы (например, PostgreSQL), выполните:

make docker-infra

9. Миграции

Чтобы применить миграции выполните команду:

make migrate-up

Чтобы откатить миграции выполните команду:

make migrate-down

10. Удаление скомпилированных файлов

Чтобы удалить все скомпилированные файлы выполните:

make clean

Этот таск запускает следующие подзадачи:

  • clean-bin: Удаляет скомпилированный бинарный файл приложения.
  • clean-proto: Удаляет скомпилированые .proto файлы.

Как использовать

  1. Настройка переменных окружения: Скопируйте файл .env.example в .env и заполните его реальными значениями.
  2. Установка инструментов: Выполните make tools-install для установки всех необходимых инструментов.
  3. Приведение в порядок Go-модулей: Выполните make go-tidy для обновления зависимостей.
  4. Генерация кода: Выполните make generate для генерации всего необходимого кода.
  5. Линтинг и форматирование: Выполните make lint и make fmt для очистки и форматирования кода.
  6. Деплой: Выполните make docker-run или make docker-infra.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published