# README
Распределенный вычислитель арифметических выражений
Проект на Go, состоящий из микросервисов, разделяет выражение на минимальные операции и выполняет каждую на отдельном агенте.

Скриншоты



- Автор - https://t.me/Kalashn11k (если что-то не работает или не запускается - напиши мне пж)
- Если что-то не понятно, то тоже пишите в тг.
- Буду рад если поставите звёздочку) ☆
Установка
- Скачать этот репозиторий на своё устройство, открыть в вашей любимой IDE
- Скачать Docker desktop v4.27.2 или выше (Если уже установлен то проверьте версию, в 4.27.1 есть баг из за которого проект не запускается) https://www.docker.com/products/docker-desktop/
- Запустить установку Docker desktop
- Запустить Docker desktop, подождать пока он всё сделает (не уверен обязательно ли там заходить в аккаунт). Он должен оставаться в фоне во время работы программы.
- В терминале открыть корневую папку с кодом (
cd <путь>
) - Прописать
docker
, если нету такой команды то вот:
Решение с хабра
Проверьте переменные зависимости. В переменной PATH мог не прописаться путь до docker.exe. Найдите путь до docker.exe (обычно в папке bin) и добавьте путь в переменную PATHЗапуск
- Запустить с помощью:
docker-compose up -d
- Подождите (иногда долго, возможно больше 10 минут)
- По окончанию загрузки должен работать интерфейс на http://localhost/ (http://localhost:80/). Когда на странице http://localhost/agents появятся воркеры, значит всё загрузилось.
- После docker-compose up -d можете перезапустить или выключить один из микросервисов.
docker-compose stop <название микросервиса / если не писать то все>
docker-compose restart <название микросервиса / если не писать то все>
docker-compose up <название микросервиса / если не писать то все> -d
Имеющиеся микросервисы:
- orchestrator - оркестратор и API
- user_server - сервер с FrontEnd, просто возвращает html
- agents - агент, запускает воркеров, количество задаётся в 22 строке docker-compose.yaml (там устанавливается environment)
- postgres - база данных PostgresSQL
Тестирование и использование
Инструкции для API не нужны ведь есть интерфейс на http://localhost:80/, API находится на http://localhost:8080/ , инструкции к нему есть в схеме
Для теста можете покликать разные кнопочки на сайте, создавать разные аккаунты и выражения.
Можете запустить большое выражение и перезагрузить оркестратора или агента (через docker-compose restart orchestrator
и docker-compose restart agent
соответсвенно) или вообще их на время выключить и потом включить для теста перезагрузки без потери состояния.
- На ввод может быть любое правильно математическое выражение, оно может содержать целые числа или с плавающей точкой, скобки, 4 оператора: +, -, *, /. Перед числами ставить знаки нельзя, только между ними (
-1 + 2
нельзя, можно только(0 - 1) + 2
)
Схема работы всего этого
Документация представлена в виде схемы ниже:
https://excalidraw.com/#json=r-Xul8-656AqJ2I7FXNsD,twgOHC54lDg_xqVgwV19Xg

А теперь по критериям
- Весь реализованный ранее функционал работает как раньше, только в контексте конкретного пользователя. За эту часть можно получить 20 баллов
✓ Да, даже время выполнения операций разное для пользователей, единственное что общее между пользователями - воркеры. Большинство API endpoint'ов требует JWT токен. В фронте это всё хранится с помощью cookie.
- У кого выражения хранились в памяти - переводим хранение в SQLite. (теперь наша система обязана переживать перезагрузку). За эту часть можно получить 20 баллов
✓ Да. В проекте используется PostgresSQL, другой диалект sql (круче, на консультации говорил что можно его). Оркестратора, агента и user_server можно перезапустить и всё восстановится, оркестратор заново достанет операции из базы данных, к агентам восстановится связь через 10 секунд.
- У кого общение вычислителя и сервера вычислений было реализовано с помощью HTTP - переводим взаимодействие на GRPC/ За эту часть можно получить 10 баллов
✓ Да. Оркестратор отправляет задания агенту через gRPC (до этого было rabbitMQ, пришлось много переделать).
Дополнительные баллы:
- За покрытие проекта модульными тестами можно получить бонусные 10 баллов
??, неполное покрытие 100% прокрытие у модуля валидации и перевода в инфиксную форму. 84% у функций авторизации (генерация JWT токена, его расшифровка, проверка пароля с его хэшэм, хэширование пароля)
- За покрытие проекта интеграционными тестами можно получить бонусные 10 баллов
✓ Да, есть 2 больших интеграционных теста: для теста gRPC агента и для теста всего API.
Оба теста поднимают с помощью testcontainers временный сервер postgres, для них создаются отдельные токены.
Что делает тест gRPC агента
Подключается по gRPC к агенту, просит выполнить всякие разные операции и сравнивает ответы.
Покрытие тестом:

Что делает тест API:
Получает токены и делает запросы на все endpoint'ы, проверяет правильность ответа. Он запускает 3 под-теста с запущенным докером:
-
Под-тест для /login и /register
-
Под-тест для мидлвеера авторизации
-
Под-тест для /expressions и /operations. Сначала создаёт много выражений, потом устанавливает время для выполнения операций, получает список всех выражений и сравнивает с тем что до этого создал, через некоторое время проверяет ответ на каждое выражение по его id.
Покрытие тестом:

Общее покрытие тестами

Для запуска тестов:
Через IDE или:
- Интеграционные тесты. Перед запуском интеграционных тестов необходимо выключить docker-compose (если запущен -
docker-compose down
)
cd tests
go test -v
cd ..
- Тесты модуля валидации и перевода в инфиксную форму
cd pkg/expressions
go test -v
cd ../..
- Тесты функций авторизации
cd internal/auth
go test -v
cd ../..
- Все тесты
go test -v ./...