- Персистентность - возможность сохранять состояние программы и восстанавливать его после перезагрузки.
- Многопользовательский режим - все операции выполняются в контексте конкретного пользователя, данные хранятся в СУБД.
Для удобной и комфортной разработки и запуска проекта рекомендую:
- Установить Go - официальный язык программирования, на котором написан backend.
- Установить Visual Studio Code - удобный редактор кода с поддержкой Go.
- Установить PostgreSQL- Система управления базами данных, которая используется в проекте для хранения и обработки данных.
- Установить Git - для клонирования репозитория проекта.После установки проверьте корректность командой:
git --version
- Установить Postman - для удобного тестирования и отладки API нашего проекта
- В Visual Studio Code установить расширение Live Server для автоматического запуска локального сервера и обновления страницы при изменениях в коде.
- Перейдите на официальный сайт: [https://go.dev/doc/install]
- Выберите свою операционную систему и скачайте установочный пакет.
- Следуйте инструкциям установщика.
- После установки добавьте путь
/usr/local/go/bin
(Linux/macOS/Windows) или путь установки Go в переменную окруженияPATH
. - Проверьте установку, открыв терминал и выполнив команду:
Вы должны увидеть установленную версию Go.
go version
- Перейдите на официальный сайт: [https://www.postgresql.org/download/]
- Выберите свою операционную систему.
- Скачайте и установите PostgreSQL, следуя инструкциям установщика.
- После установки настройте пользователя и базу данных для проекта.
- Убедитесь, что сервер PostgreSQL запущен.
- Перейдите на официальный сайт: https://git-scm.com/downloads
- Скачайте и установите Git для вашей ОС.
- Проверьте установку, открыв терминал и выполнив команду:
Вы должны увидеть установленную версию Git.
git --version
- Откройте VS Code.
- Перейдите в раздел расширений (иконка квадратов слева или
Ctrl+Shift+X
). - В поиске введите
Live Server
. - Нажмите кнопку Установить.
- После установки в правом нижнем углу появится кнопка Go Live - нажмите её для запуска сервера.
- Перейдите на официальный сайт: [https://www.postman.com/downloads/]
- Выберите версию для вашей операционной системы (Windows, macOS, Linux).
- Скачайте и установите приложение.
- Запустите Postman и создайте учётную запись (рекомендуется для синхронизации).
Проект состоит из двух основных частей:
-
- клиентская часть, реализованная на HTML, CSS и JavaScript. В папке
frontend
находится подробная документация по установке и запуску фронтенда. -
Backend - серверная часть, написанная на Go, обеспечивающая логику приложения, работу с базой данных и API.
distributed-calculator
│
├── backend
│ ├── calc1
│ │ └── main.go
│ ├── calc2
│ │ └── main.go
│ ├── orchestrator
│ │ └── main.go
│ └── utility
│ ├── calculation
│ │ └── calculation.go
│ ├── database
│ │ └── database.go
│ └── models
│ └── calculations.go
│
├── frontend
│ ├── index.html
│ ├── script.js
│ ├── styles.css
│ ├── README(ru).md
│ └── README(eng).md
│
├── go.mod
├── go.sum
├── README(ru).md
└── README(eng).md
- calc1/ и calc2/
Два отдельных сервиса-калькулятора, которые выполняют арифметические вычисления. Каждый реализован как отдельное приложение с файломmain.go
. - orchestrator/
Оркестратор работает как главный диспетчер: принимает примеры от пользователей, распределяет их между калькуляторами, следит за нагрузкой, сохраняет результаты и проверяет права доступа. - utility/
Вспомогательные пакеты, используемые во всех сервисах backend: calculation/
- содержит логику вычислений и алгоритмы обработки арифметических выражений.database/
- реализует работу с базой данных PostgreSQL, включая хранение и обновление данных о вычислениях и пользователях.models/
- описывает структуры данных и модели, используемые в проекте (например, модели вычислений, пользователей и т.д.).
Для начала работы с проектом необходимо клонировать репозиторий на локальный компьютер.
Откройте терминал и выполните команду:
git clone https://github.com/ruslan709/distributed-calculator.git
После клонирования репозитория перейдите в папку проекта для выполнения последующих команд:
cd distributed-calculator
Чтобы установить все зависимости проекта, выполните в директории проекта команду:
go mod tidy
Эта команда скачает и установит все необходимые зависимости, указанные в файле go.mod
.
Проект включает несколько backend-сервисов: оркестратор и два калькулятора (calc1
и calc2
).
Для корректной работы их необходимо запускать в отдельных терминальных окнах или вкладках.
Откройте новый терминал, перейдите в папку оркестратора и запустите сервис:
cd backend/orchestrator
go run main.go
В другом терминале перейдите в папку первого калькулятора и запустите его:
cd backend/calc1
go run main.go
В третьем терминале перейдите в папку второго калькулятора и запустите его:
cd backend/calc2
go run main.go
После запуска всех сервисов backend будет готов к работе.
Для запуска фронтенда используйте инструкции из папки Frontend
curl -X GET http://localhost:8080/orchestrator-status```
Пример ответа сервера:
```json
{
"running": true,
"message": "Orchestrator is running"
}
curl -X GET http://localhost:8080/ping-servers
Пример ответа сервера:
[
{
"url": "http://localhost:8081",
"running": true,
"maxGoroutines": 5,
"currentGoroutines": 2
},
{
"url": "http://localhost:8082",
"running": false,
"error": "Connection refused"
}
]
Для отправки вычислительной задачи на сервер калькулятора, используйте следующий curl
запрос:
curl -X POST http://localhost:8081/calculate -H "Content-Type: application/json" -d '{
"id": 1,
"userId": "1",
"operation": "2+2",
"times": {
"add_duration": 1,
"subtract_duration": 1,
"multiply_duration": 1,
"divide_duration": 1
}
}'
Пример ответа сервера:
{
"message": "Calculation started successfully."
}
curl -X GET http://localhost:8081/goroutines
Пример ответа сервера:
Current number of goroutines: 1
curl -X GET http://localhost:8081/ping
Пример ответа сервера:
{
"status": "running",
"maxGoroutines": 5,
"currentGoroutines": 1
}
curl -X POST http://localhost:8081/shutdown
Пример ответа сервера:
Server is shutting down...
Данный проект демонстрирует принципы построения масштабируемых, отказоустойчивых и многопользовательских распределённых систем на языке Go с использованием современных технологий: gRPC, PostgreSQL, JWT-авторизации и микросервисной архитектуры.