- HTTP-сервер для приема и перенаправления запросов
- Настраиваемая конфигурация через YAML-файл или переменные окружения
- Поддержка различных алгоритмов распределения нагрузки:
- Round Robin (циклическое распределение)
- Random (случайное распределение)
- Проверка доступности бэкенд-серверов (health checks)
- Обработка ситуаций с недоступными серверами
- Конкурентная обработка запросов с использованием горутин
- Подробное логирование всех операций
- Реализация алгоритма Token Bucket
- Индивидуальные ограничения для каждого клиента (по IP-адресу)
- Настраиваемые параметры: емкость бакета и скорость пополнения токенов
- Автоматическое пополнение токенов с использованием таймера
- Потокобезопасная работа в условиях высокой нагрузки
- API для управления настройками клиентов:
- Изменение лимитов для отдельных клиентов
- Поддержка хранения данных в Redis или в памяти
- Graceful shutdown для корректного завершения работы
- Docker и Docker Compose для простого развертывания
- Интеграционные тесты для проверки работоспособности
Проект имеет модульную архитектуру и разделен на следующие компоненты:
- app - основной компонент, объединяющий все остальные части
- balancer - модуль балансировки нагрузки
- limiter - модуль ограничения частоты запросов
- storage - интерфейсы и реализации хранилищ данных
- config - работа с конфигурацией
- handler - обработчики HTTP-запросов для API
- model - общие структуры данных
-
Установите Go (версия 1.24+)
-
Настройте конфигурацию в файле
config/config.yml:logger: level: debug proxy_server: port: 8080 read_timeout: 10s api_server: port: 8081 read_timeout: 10s rate_limiter: enabled: true default_rate: 100 capacity: 100 refill_interval: 1s health_check: enabled: true check_interval: 5s balancer: strategy: round_robin # или random backends: - http://localhost:8091 - http://localhost:8092 - http://localhost:8093
-
Запустите приложение:
go run cmd/app/main.go
-
Установите Docker и Docker Compose
-
Соберите и запустите контейнеры:
docker-compose up -d
-
Для остановки:
docker-compose down
# Простой запрос
curl http://localhost:8080/
# Отправка большого количества запросов (тест нагрузки)
ab -n 1000 -c 100 http://localhost:8080/# Установка скорости для клиента
curl -X POST -H "Content-Type: application/json" -d '{"clientId":"127.0.0.1","rate":50}' http://localhost:8081/client/rate
# Установка емкости для клиента
curl -X POST -H "Content-Type: application/json" -d '{"clientId":"127.0.0.1","capacity":200}' http://localhost:8081/client/capacity
# Блокировка клиента
curl -X POST -H "Content-Type: application/json" -d '{"clientId":"127.0.0.1","capacity":0}' http://localhost:8081/client/capacitygo test ./...
go test -tags=integration ./integration/...
go test -race ./...- Go версии 1.24 или выше
- Redis (опционально, для хранения данных)
- Docker и Docker Compose (для запуска в контейнерах)