Categorygithub.com/KalashnikovProjects/ZadachaGoYaLyceum
module
0.0.0-20241013112734-13a5213e49de
Repository: https://github.com/kalashnikovprojects/zadachagoyalyceum.git
Documentation: pkg.go.dev

# README

Распределенный вычислитель арифметических выражений

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

Главная страница
Скриншоты Страница статусов выражений Страница входа в аккаунт Страница воркеров
  • Автор - https://t.me/Kalashn11k (если что-то не работает или не запускается - напиши мне пж)
  • Если что-то не понятно, то тоже пишите в тг.
  • Буду рад если поставите звёздочку) ☆

Установка

  1. Скачать этот репозиторий на своё устройство, открыть в вашей любимой IDE
  2. Скачать Docker desktop v4.27.2 или выше (Если уже установлен то проверьте версию, в 4.27.1 есть баг из за которого проект не запускается) https://www.docker.com/products/docker-desktop/
  3. Запустить установку Docker desktop
  4. Запустить Docker desktop, подождать пока он всё сделает (не уверен обязательно ли там заходить в аккаунт). Он должен оставаться в фоне во время работы программы.
  5. В терминале открыть корневую папку с кодом (cd <путь>)
  6. Прописать docker, если нету такой команды то вот:
Решение с хабра Проверьте переменные зависимости. В переменной PATH мог не прописаться путь до docker.exe. Найдите путь до docker.exe (обычно в папке bin) и добавьте путь в переменную PATH

Запуск

  1. Запустить с помощью: docker-compose up -d
  2. Подождите (иногда долго, возможно больше 10 минут)
  3. По окончанию загрузки должен работать интерфейс на http://localhost/ (http://localhost:80/). Когда на странице http://localhost/agents появятся воркеры, значит всё загрузилось.
  4. После 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

Документация в виде схемы

А теперь по критериям

  1. Весь реализованный ранее функционал работает как раньше, только в контексте конкретного пользователя. За эту часть можно получить 20 баллов

✓ Да, даже время выполнения операций разное для пользователей, единственное что общее между пользователями - воркеры. Большинство API endpoint'ов требует JWT токен. В фронте это всё хранится с помощью cookie.

  1. У кого выражения хранились в памяти - переводим хранение в SQLite. (теперь наша система обязана переживать перезагрузку). За эту часть можно получить 20 баллов

✓ Да. В проекте используется PostgresSQL, другой диалект sql (круче, на консультации говорил что можно его). Оркестратора, агента и user_server можно перезапустить и всё восстановится, оркестратор заново достанет операции из базы данных, к агентам восстановится связь через 10 секунд.

  1. У кого общение вычислителя и сервера вычислений было реализовано с помощью HTTP - переводим взаимодействие на GRPC/ За эту часть можно получить 10 баллов

✓ Да. Оркестратор отправляет задания агенту через gRPC (до этого было rabbitMQ, пришлось много переделать).

Дополнительные баллы:

  1. За покрытие проекта модульными тестами можно получить бонусные 10 баллов

??, неполное покрытие 100% прокрытие у модуля валидации и перевода в инфиксную форму. 84% у функций авторизации (генерация JWT токена, его расшифровка, проверка пароля с его хэшэм, хэширование пароля)

  1. За покрытие проекта интеграционными тестами можно получить бонусные 10 баллов

✓ Да, есть 2 больших интеграционных теста: для теста gRPC агента и для теста всего API.

Оба теста поднимают с помощью testcontainers временный сервер postgres, для них создаются отдельные токены.

Что делает тест gRPC агента

Подключается по gRPC к агенту, просит выполнить всякие разные операции и сравнивает ответы.

Покрытие тестом:

Покрытие тестом gRPC агента

Что делает тест API:

Получает токены и делает запросы на все endpoint'ы, проверяет правильность ответа. Он запускает 3 под-теста с запущенным докером:

  • Под-тест для /login и /register

  • Под-тест для мидлвеера авторизации

  • Под-тест для /expressions и /operations. Сначала создаёт много выражений, потом устанавливает время для выполнения операций, получает список всех выражений и сравнивает с тем что до этого создал, через некоторое время проверяет ответ на каждое выражение по его id.

Покрытие тестом:

Покрытие тестом API

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

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

Для запуска тестов:

Через 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 ./...

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author