Этот проект представляет собой HTTP-балансировщик нагрузки, реализованный на языке Go. Он поддерживает алгоритмы round-robin и least connections для распределения запросов между бэкенд-серверами.
- Балансировка нагрузки: Поддержка алгоритмов round-robin и least connections.
- Управление бэкенд-серверами: Добавление и удаление серверов через API.
- Управление алгоритмом балансировки: Изменение алгоритма балансировки через API.
- Конфигурация: Настройка через параметры командной строки.
- Логирование: Стандартное логирование с помощью пакета
log. - Graceful Shutdown: Корректное завершение работы при получении сигналов SIGINT или SIGTERM.
- Обработка ошибок: Возврат структурированных JSON-сообщений об ошибках.
- Health Check: Периодическая проверка состояния бэкенд-серверов.
-
Склонируйте репозиторий:
git clone https://github.com/vcreatorv/load-balancer.git cd load-balancer -
Установите зависимости:
go mod tidy
-
Запустите балансировщик:
go run ./cmd/app/main.go --port=8090 --servers="http://127.0.0.1:8081,http://127.0.0.1:8082"Флаги командной строки:
--port: Порт для прослушивания балансировщиком (по умолчанию: 8080).--servers: Список URL-адресов бэкенд-серверов, разделенных запятыми.
-
Запустите бэкенд-серверы:
go run ./cmd/pool/main.go
Этот скрипт запускает три сервера на портах 8081, 8082 и 8083.
-
Перенаправление запроса:
GET http://localhost:8090/loadbalancer/helloПример ответа:
Hello from Server 1! -
Добавление сервера:
POST http://localhost:8090/loadbalancer/backend/addТело запроса:
{ "server_url": "http://localhost:8083/" } -
Удаление сервера:
DELETE http://localhost:8090/loadbalancer/backend/deleteТело запроса:
{ "server_url": "http://localhost:8081/" } -
Изменение алгоритма балансировки:
POST http://localhost:8090/loadbalancer/algorithm/setТело запроса:
{ "algorithm": "round-robin" }
Примеры сообщений об ошибках:
-
Backend не найден:
{ "status": 404, "message": "Backend not found (http://127.0.0.1:8081)" } -
Backend уже существует:
{ "status": 409, "message": "A backend with this url already exists (http://127.0.0.1:8083)" } -
Неправильный формат данных:
{ "status": 400, "message": "server_url: not_a_url does not validate as url" }
Периодическая проверка состояния бэкенд-серверов реализована с использованием функции StartHealthCheck. Проверка выполняется каждые 2 минуты и логирует статус каждого сервера (UP или DOWN).
Пример логов:
2025/05/06 10:23:26 Starting health check...
2025/05/06 10:23:26 Backend http://127.0.0.1:8081 [status=UP]
2025/05/06 10:23:26 Backend http://127.0.0.1:8082 [status=UP]
2025/05/06 10:23:26 Site unreachable, error: dial tcp 127.0.0.1:8084: connectex: No connection could be made because the target machine actively refused it.
2025/05/06 10:23:26 Backend http://127.0.0.1:8084 [status=DOWN]
2025/05/06 10:23:26 Health check completed
При сбое запроса к бэкенд-серверу выполняется до MAX_RETRIES повторных попыток. Если все попытки неуспешны, сервер помечается как неработающий, и запрос перенаправляется на другой сервер.
Если количество попыток (ATTEMPTS) превышает заданное максимальное значение MAX_ATTEMPTS, запрос завершается с ошибкой.
- Пример ошибки:
{ "status": 500, "message": "service not available" }
Примеры логов об ошибках:
2025/05/06 10:36:02 PROXY ERROR: [127.0.0.1:8086] dial tcp 127.0.0.1:8086: connectex: No connection could be made because the target machine actively refused it.
2025/05/06 10:36:02 Address=[::1]:55390 Request=/hello Max attempts reached, terminating