Skip to content

DobryySoul/Calc-service

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Calc service

Описание проекта

Calc service — это проект, реализован на языке программирования Golang, предназначен для вычисления арифметических выражений, таких как "(6+(2+2)*2)/10". Главная цель этого сервиса заключается в том, чтобы предоставить возможность быстро и точно обрабатывать математические выражения, используя параллельые вычисления. Калькулятор автоматически разбивает выражение на задачи и параллельно производит вычисления. Это позволяет значительно ускорить процесс вычислений и сделать их более эффективными.

Warning

P.S. Если запускаете проект не через docker меняйте параметр host в конфигурациях сервисов обязательно

Схема работы проекта

Прикладываю для вас схему, для наглядного описания, как происходит взаимодействие.

Настройка

  1. Клонируйте репозиторий:
git clone https://github.com/DobryySoul/Calc-service.git
  1. Перейдите в корневую папку проекта, если это не было еще сделано:
cd Сalc-service
  1. Установите зависимости:
cd agent
go mod tidy

cd orchestrator
go mod tidy

Отлично, это уже успех! Если вы хотите изменить параметры конфигурации проекта, то продолжите чтение, если же нет, то переходите на следующий этап.

Конфигурация

Сервис можно настроить с помощью переменных среды. Со списком и описанием доступных параметров к настройке можно ознакомиться здесь.

Чтобы указать параметры переменной среды, который вы хотите использовать, необходимо изменить файл .env.example на .env и изменить переменные, иначе сервер будет запущен на дефолтных значениях, которые указаны в этом файле.

Также есть возможность указать значения переменных среды через команды в терминале, пример:

Windows

$env:PORT=порт

Linux и macOS

export PORT=порт

C GRPC-контрактами можно ознакомиться контракт.

Endpoints

Сервис имеет следующий эндпоинты:

  • /api/v1/register - получить страницу регистрации.

  • /api/v1/login - получить страницу логина.

  • /api/v1/register - отправить запрос на регистрацию.

  • /api/v1/login - отправить запрос на авторизацию.

  • /api/v1/calculate - отправить новое выражение для вычисления.

  • /api/v1/expressions - получить список всех выражений.

  • /api/v1/expression/:id - получить выражение по идентификатору id.

  • /internal/task - получить задачу для обработки/отправить результат.

    • GET: отдает задачу на выполнение.

    • POST: отправляет результат выполнения.

    {
        "id": уникальный идентификатор,
        "result": результат вычислений
    }

Запуск

Проект готов к запуску. P.S. не забудте поменять пароль от базы данных в makefile, docker-compose.yml и в файле .env.

Бэкенд делиться на 2 части:

  1. Оркестратор

  2. Агент

Команды, чтобы запустить их:

  1.  cd orchestrator
     go run cmd/main.go
  2.  cd agent
     go run cmd/main.go
  3. При условии что у вас запущен postgresql, то можно запустить миграции из корня проекта:

make migrations-up

Для более изянтного запуска, можно использовать makefile и docker-compose: Самый простой способ запустить всё вместе использовать команду makefile из корня проекта:

make all

Команда прогонит все тесты, запустит все сервисы(если у вас установлен docker) и запустит миграции. Или, если вы сторонник docker-compose, то можно запустить сервисы с помощью команды:

docker-compose up -d --build

А затем запустить миграции командой:

make migrations-docker-up

Если что-то пошло не так, то можно откатить миграции:

make migrations-docker-down

Мои поздравления! Сервис успешно запущен и готов к функционированию.

Список параметров конфигурации

host

(адрес) адрес для запуска приложения

  • Эквивалент env: HOST.

port

(номер) порт для запуска приложения

  • Эквивалент env: PORT.

grpc_port

(номер) порт для запуска gRPC-сервера

  • Эквивалент env: GRPCPort.

time_addition_ms

(продолжительность) время выполнения операции сложения в миллисекундах

  • Эквивалент env: TIME_ADDITION_MS.

time_subtraction_ms

(продолжительность) время выполнения операции вычитания в миллисекундах

  • Эквивалент env: TIME_SUBTRACTION_MS.

time_multiplications_ms

(продолжительность) время выполнения операции умножения в миллисекундах

  • Эквивалент env: TIME_MULTIPLICATIONS_MS.

time_divisions_ms

(продолжительность) время выполнения операции деления в миллисекундах

  • Эквивалент env: TIME_DIVISIONS_MS.

postgres_username

(имя) имя пользователя базы данных

  • Эквивалент env: POSTGRES_USERNAME.

postgres_password

(пароль) пароль от сервера постгрес

  • Эквивалент env: POSTGRES_PASSWORD.

postgres_host

(адрес) адрес сервера базы данных

  • Эквивалент env: POSTGRES_HOST.

postgres_port

(номер) порт сервера базы данных

  • Эквивалент env: POSTGRES_HOST.

postgres_database

(название) имя базы данных

  • Эквивалент env: POSTGRES_DATABASE.

postgres_max_conn

(количество) максимальное количество соединений с сервером базы данных

  • Эквивалент env: POSTGRES_MAX_CONN.

postgres_min_conn

(количество) минимальное количество соединений с сервером базы данных

  • Эквивалент env: POSTGRES_MIN_CONN.

jwt_secret

(название) секретный ключ для генерации токена

  • Эквивалент env: JWT_SECRET.

postgres_min_conn

(продолжительность) время жизни токена

  • Эквивалент env: JWT_TTL.

Также вы можете настроить параметры конфигурации агента, переименовав файл config.example.yaml на config.yaml и изменить параметры, порт должен совпадать с grpc-портом, который указан в файле .env.example или в вашем аналоге .env

Обработка запросов и ошибок

Статус коды

В зависимости от типа запроса, а также корректности выражения, сервер дает различные ответы, с соответствующими статус кодами:

Important

/api/v1/register

  • 200: Ответ на успешную регистрацию:
{
    "email": "[email protected]",
    "password": "123qweQWE!@#"
}

Warning

Предупреждаю, что на сервере стоит строгая валидация, поэтому у вас не получится зарегистрироваться с невалидным email или паролем. Email должен включать символ @ и точку, а пароль должен содержать минимум 1 цифру, 1 букву, 1 спецсимвол, и быть не короче 8 символов.

Important

/api/v1/login

  • 200: Ответ на успешную авторизацию, в ответ вы также получите токен, который вам нужно будет использовать для авторизации в других запросах, но если же вы используете веб-версию, то об этом вам не стоит беспокоиться:
{
    "email": "[email protected]",
    "password": "123qweQWE!@#"
}

Important

/api/v1/calculate

  • 201: Ответ на добавление выражения для вычисления в верном формате:
{
    "expression": "2 + 2 * 15" // аримфметическое выражение верного формата -> string
}

  • 422: Ошибка в арифметическом выражении, невалидный формат, пример:
{
    "expression": "2 + 2 * 15
}

Important

/api/v1/expressions

  • 200: Успешно получен список выражений:

Important

/api/v1/expressions/:id

  • 200: Успешно полученное выражение по идентификатору id:

  • 404: Выражение не было найдено по id:

Important

/internal/task

  • 200: Задача успешно получена:

  • 404: Нет задач для выполнения:

  • 200: Успешно записан результат задачи в формате
{
    "id": 0, // идентификатор задачи -> int
    "result": 30 // валидный формат ответа-> int
}

  • 404: По данному id не было найдено задачи.

  • 422: Невалидный формат введенных данных, пример:
{
    "id": 0, // идентификатор задачи -> int
    "result": "30" // невалидный формат ответа -> string
}

  • 500: Случай внутренней ошибки сервера. Данная ошибка не возникает, так как сервер работает полностью исправно, но все же данная ошибка должна обрабатываться, на случай, когда сервер не сможет обработать запрос к сайту или дать ответ.

Frontend

Перейдя в браузере по адресу http://localhost:9090/api/v1/register (если запускали на дефолтном значении переменных окружения), вы попадете на страницу регистрации, далее пройдя и авторизацию вы попадете на внешний интерфейс сервиса.

  1. Форма для отправки нового выражения на сервер.
  2. Кнопка Вычислить отправляет выражение на бэкенд, для дальнейшего взаимодействия с ним.

  1. Форма для ввода id выражения, информацию о котором вы хотите получить.
  2. Кнопка Получить непостредственно запрашивает информацию о выражении с введенным id, если такое выражение существует, то оно будет выведено.

  1. Кнопка для обновления списка всех выражений. Несмотря на то, что сайт сам обновляется при получении нового выражения на вычисление, если выражения будут посчитаны кем-то, например, агентами, то необходимо будет нажать Обновить список, для вывода актульной информации.

  1. Извлекает задачу из выражения и отправляет ее вам для подсчета.

  1. Сюда необходимо вставить id актуальной задачи.
  2. Результат ваших вычислений.
  3. Кнопка взаимодействия(отправки результата на сервер).

  1. Форма отображения статистики, статистика ведется по количеству выполняемых операций, информация собирается в момент отправки выражений на сервер, когда они поступают на бэкенда, для отображения информации нажмите F5. При необходимости ее можно скрыть нажав на Количество операций.

Tip

Как это все может выглядеть в совокупности

About

poke at the star, Please<3

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published