Этот проект представляет собой выполнение финальной задачи в Яндекс.Лицее ("распределенная система для выполнения вычислений"). Система состоит из 2х основных компонентов: оркестратор - "менеджер", управляющий и координирующий вычислениями; агент - "вычислитель", отвечающий за обработку вычислений.
- Мок-тест
- Контакты
- Откройте нужную директорию в терминале и клонируйте туда репозиторий:
git clone https://github.com/dusk-chancellor/distributed_calculator.git
Вы также можете скачать zip файл проекта и извлечь его в нужную директорию.
- Перейдите в директорию проекта:
cd distributed_calculator
- Установите обязательные зависимости:
go mod tidy
- Запустите оркестратор с рабочей директории:
go run ./cmd/orchestrator/main.go
В терминале должно отобразиться 'running Orchestrator server at localhost:8080' и 'running Orchestrator manager'
- Запустите агента с рабочей директории:
go run ./cmd/agent/main.go
В терминале вы должны увидеть 'tcp listener started at localhost:5000'
- Перейти на localhost:8080 и начать проверять !
-
Запустите Docker Desktop или же запустите docker daemon
-
Поднимите контейнеры:
docker-compose up
-
Ждите, много.
-
Отправляйтесь на localhost:8080 и начинайте проверять !
P.S Автор не рекоммендует данный метод, т.к в его случае при запуске
контейнеров вылетели все фиксики из компьютера 😃
При проверке проекта с браузера рекомендуется постоянно отслеживать консоль и состояние сети нажатием на F12. Так, Вам будет удобнее проверять что и как происходит.
- После этапа запуска всех компонентов и перехода по localhost:8080 вас должно было перекинуть на localhost:8080/auth (если так не произошло, то пожалуйста обновите страничку)
- Создайте для начала аккаунт: подберите запоминающееся имя и пароль, а затем нажмите на кнопку "Sign up"
- Теперь можете заходить в свой аккаунт: введите те же данные и нажмите на кнопку "Login". После успешного входа Вас должно перебросить на главную страницу проекта
Созданный при входе токен протухнет через 3 минуты и вам надо будет снова перезаходить в свой аккаунт. Это было сделано для того, чтобы проверить его работоспособность.
- Введем пример '2+2*2', отправим его на вычисление кнопкой "Send" и обновим страничку
- Обновляем страницу пока пример не решится
Кнопка удалить работает. Зайдя в другой аккаунт, вы не обнаружите выражений других пользователей.
├── cmd - запуск компонентов
│ ├── agent - "вычислитель"
│ │ └── main.go
│ └── orchestrator - "менеджер"
│ │ └── main.go
├── database - база данных
│ └── storage.db #sqlite3
├── frontend - внешняя оболочка
│ ├── auth - страница аутентификации
│ │ ├── index.html
│ │ ├── script.js
│ │ └── style.css
│ ├── main - главная страница
│ │ ├── index.html
│ │ ├── script.js
│ │ └── style.css
├── internal - внутренние пакеты
│ ├── grpc - коннекторы грпц связи
│ │ ├── agent - для агента (запуск tcp слушателя)
│ │ │ └── agent.go
│ │ └── orchestrator - для оркестратора (методы отправки запросов)
│ │ │ └── orchestrator.go
│ ├── http - для http-запросов
│ │ ├── handlers - REST API хендлеры
│ │ │ ├── auth - хендлеры авторизации
│ │ │ │ └── auth.go
│ │ │ ├── expression - хендлеры работы с выражениями
│ │ │ │ └── expression.go
│ ├── storage - методы для взаимодействия с базой данных
│ │ ├── expression_storage.go - методы для expressions table
│ │ ├── storage.go - инициализация и создание таблиц
│ │ └── user_storage.go - методы для users table
│ ├── utils - доп.инструменты для полноценной работы компонентов
│ │ ├── agent - инструменты агента
│ │ │ ├── calculation - произведение вычисления
│ │ │ │ ├── calculation.go
│ │ │ │ └── stack.go
│ │ │ ├── infix_to_postfix - превращение выражения в постфиксную запись
│ │ │ │ ├── infix_to_postfix.go
│ │ │ │ └── stack.go
│ │ │ ├── validator - валидация допустимости выражения
│ │ │ │ └── validator.go
│ │ ├── orchestrator - инструменты оркестратора
│ │ │ ├── jwts - генерация и валидация jwt-токенов
│ │ │ │ └── jwts.go
│ │ │ ├── manager - служба постоянной связи с базой данных и отправки выражения агенту
│ │ │ │ └── manager.go
├── proto - прото и сгенерированные файлы для grpc общения
│ ├── agent_grpc.pb.go
│ ├── agent.pb.go
│ └── agent.proto
├── docker-compose.yaml
├── Dockerfile.Agent
├── Dockerfile.Orchestrator
├── go.mod
├── go.sum
├── LICENSE
└── README.md
| POST /auth/signup/ | -> | RegisterUserHandler | -> | RegisterUser |
| POST /auth/login/ | -> | LoginUserHandler | -> | LoginUser |
| POST /expression/ | -> | CreateExpressionHandler | -> | InsertExpression |
| GET /expression/ | -> | GetExpressionsHandler | -> | SelectExpressionsByID |
| DELETE /expression/{id}/ | -> | DeleteExpressionHandler | -> | DeleteExpression |
В этом проекте используются следующие технологии и инструменты:
- Golang: Основной язык программирования, используемый для разработки всех компонентов системы
-
gRPC: Используется для создания высокопроизводительного, открытого и универсального RPC-фреймворка
-
JWT: Используется для аутентификации и авторизации пользователей
-
Protocol Buffers: Используется для определения структуры данных и сервисов, обеспечивая эффективное и быстрое сериализование данных
- SQLite3: Используется в качестве легковесной базы данных для хранения информации о пользователях и выражениях. Запланировано: миграция базы данных на PostgreSQL
- HTML, CSS, JavaScript: Используются для создания веб-интерфейса, обеспечивая интерактивность и удобство использования для пользователей. Веб-интерфейс для этого проекта был максимально упрощен
-
Docker: Используется для контейнеризации компонентов системы, обеспечивая удобство развертывания и масштабирования
-
Docker Compose: Используется для определения и запуска многоконтейнерных приложений Docker, упрощая процесс развертывания и управления контейнерами.
Стоит учесть, что все выше перечисленные технологии не были применены в их полную силу
Если у вас вдруг что-то не работает, есть вопросы или предложения, то пожалуйста обратитесь ко мне