Calc service — это проект, реализован на языке программирования Golang, предназначен для вычисления арифметических выражений, таких как "(6+(2+2)*2)/10". Главная цель этого сервиса заключается в том, чтобы предоставить возможность быстро и точно обрабатывать математические выражения, используя параллельые вычисления. Калькулятор автоматически разбивает выражение на задачи и параллельно производит вычисления. Это позволяет значительно ускорить процесс вычислений и сделать их более эффективными.
Warning
P.S. Если запускаете проект не через docker меняйте параметр host в конфигурациях сервисов обязательно
Прикладываю для вас схему, для наглядного описания, как происходит взаимодействие.
- Клонируйте репозиторий:
git clone https://github.com/DobryySoul/Calc-service.git- Перейдите в корневую папку проекта, если это не было еще сделано:
cd Сalc-service- Установите зависимости:
cd agent
go mod tidy
cd orchestrator
go mod tidyОтлично, это уже успех! Если вы хотите изменить параметры конфигурации проекта, то продолжите чтение, если же нет, то переходите на следующий этап.
Сервис можно настроить с помощью переменных среды. Со списком и описанием доступных параметров к настройке можно ознакомиться здесь.
Чтобы указать параметры переменной среды, который вы хотите использовать, необходимо изменить файл .env.example на .env и изменить переменные, иначе сервер будет запущен на дефолтных значениях, которые указаны в этом файле.
Также есть возможность указать значения переменных среды через команды в терминале, пример:
$env:PORT=портexport PORT=портC GRPC-контрактами можно ознакомиться контракт.
Сервис имеет следующий эндпоинты:
-
/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 части:
-
Оркестратор
-
Агент
Команды, чтобы запустить их:
-
cd orchestrator go run cmd/main.go -
cd agent go run cmd/main.go -
При условии что у вас запущен 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Мои поздравления! Сервис успешно запущен и готов к функционированию.
(адрес) адрес для запуска приложения
- Эквивалент env:
HOST.
(номер) порт для запуска приложения
- Эквивалент env:
PORT.
(номер) порт для запуска gRPC-сервера
- Эквивалент env:
GRPCPort.
(продолжительность) время выполнения операции сложения в миллисекундах
- Эквивалент env:
TIME_ADDITION_MS.
(продолжительность) время выполнения операции вычитания в миллисекундах
- Эквивалент env:
TIME_SUBTRACTION_MS.
(продолжительность) время выполнения операции умножения в миллисекундах
- Эквивалент env:
TIME_MULTIPLICATIONS_MS.
(продолжительность) время выполнения операции деления в миллисекундах
- Эквивалент env:
TIME_DIVISIONS_MS.
(имя) имя пользователя базы данных
- Эквивалент env:
POSTGRES_USERNAME.
(пароль) пароль от сервера постгрес
- Эквивалент env:
POSTGRES_PASSWORD.
(адрес) адрес сервера базы данных
- Эквивалент env:
POSTGRES_HOST.
(номер) порт сервера базы данных
- Эквивалент env:
POSTGRES_HOST.
(название) имя базы данных
- Эквивалент env:
POSTGRES_DATABASE.
(количество) максимальное количество соединений с сервером базы данных
- Эквивалент env:
POSTGRES_MAX_CONN.
(количество) минимальное количество соединений с сервером базы данных
- Эквивалент env:
POSTGRES_MIN_CONN.
(название) секретный ключ для генерации токена
- Эквивалент env:
JWT_SECRET.
(продолжительность) время жизни токена
- Эквивалент env:
JWT_TTL.
Также вы можете настроить параметры конфигурации агента, переименовав файл config.example.yaml на config.yaml и изменить параметры, порт должен совпадать с grpc-портом, который указан в файле .env.example или в вашем аналоге .env
В зависимости от типа запроса, а также корректности выражения, сервер дает различные ответы, с соответствующими статус кодами:
200: Ответ на успешную регистрацию:
{
"email": "[email protected]",
"password": "123qweQWE!@#"
}Warning
Предупреждаю, что на сервере стоит строгая валидация, поэтому у вас не получится зарегистрироваться с невалидным email или паролем.
Email должен включать символ @ и точку, а пароль должен содержать минимум 1 цифру, 1 букву, 1 спецсимвол, и быть не короче 8 символов.
200: Ответ на успешную авторизацию, в ответ вы также получите токен, который вам нужно будет использовать для авторизации в других запросах, но если же вы используете веб-версию, то об этом вам не стоит беспокоиться:
{
"email": "[email protected]",
"password": "123qweQWE!@#"
}201: Ответ на добавление выражения для вычисления в верном формате:
{
"expression": "2 + 2 * 15" // аримфметическое выражение верного формата -> string
}422: Ошибка в арифметическом выражении, невалидный формат, пример:
{
"expression": "2 + 2 * 15
}200: Успешно получен список выражений:
200: Успешно полученное выражение по идентификатору id:
404: Выражение не было найдено по id:
200: Задача успешно получена:
404: Нет задач для выполнения:
200: Успешно записан результат задачи в формате
{
"id": 0, // идентификатор задачи -> int
"result": 30 // валидный формат ответа-> int
}404: По данному id не было найдено задачи.
422: Невалидный формат введенных данных, пример:
{
"id": 0, // идентификатор задачи -> int
"result": "30" // невалидный формат ответа -> string
}500: Случай внутренней ошибки сервера. Данная ошибка не возникает, так как сервер работает полностью исправно, но все же данная ошибка должна обрабатываться, на случай, когда сервер не сможет обработать запрос к сайту или дать ответ.
Перейдя в браузере по адресу http://localhost:9090/api/v1/register (если запускали на дефолтном значении переменных окружения), вы попадете на страницу регистрации, далее пройдя и авторизацию вы попадете на внешний интерфейс сервиса.
- Форма для отправки нового выражения на сервер.
- Кнопка
Вычислитьотправляет выражение на бэкенд, для дальнейшего взаимодействия с ним.
- Форма для ввода id выражения, информацию о котором вы хотите получить.
- Кнопка
Получитьнепостредственно запрашивает информацию о выражении с введенным id, если такое выражение существует, то оно будет выведено.
- Кнопка для обновления списка всех выражений. Несмотря на то, что сайт сам обновляется при получении нового выражения на вычисление, если выражения будут посчитаны кем-то, например, агентами, то необходимо будет нажать
Обновить список, для вывода актульной информации.
- Извлекает задачу из выражения и отправляет ее вам для подсчета.
- Сюда необходимо вставить id актуальной задачи.
- Результат ваших вычислений.
- Кнопка взаимодействия(отправки результата на сервер).
- Форма отображения статистики, статистика ведется по количеству выполняемых операций, информация собирается в момент отправки выражений на сервер, когда они поступают на бэкенда, для отображения информации нажмите
F5. При необходимости ее можно скрыть нажав наКоличество операций.



















