gloadbal — простой HTTP load balancer (reverse proxy), который распределяет входящие запросы по набору backend-серверов с помощью сменяемых алгоритмов балансировки. Маршрутизация реализована через net/http + httputil.ReverseProxy, а выбор backend инкапсулирован в интерфейсе итератора.
- Reverse proxy на
httputil.NewSingleHostReverseProxyдля каждого backend. - Плагинообразные алгоритмы выбора backend через интерфейс
Iterator:- Round Robin
- Weighted Round Robin (с весами)
- Least Connections (по текущему числу активных запросов)
- Random
- Учет текущей нагрузки backend (число параллельных запросов) через атомарный счетчик.
- Подготовлен модуль health-check’ов: периодическая TCP-проверка доступности origin (DialTimeout), с возможностью подмены check-функции и периода.
proxy.Proxy— обертка надhttputil.ReverseProxy, считает текущую нагрузку (load) и проксирует запросы.iterator.Iterator— интерфейс стратегии балансировки:Next() (*proxy.Proxy, error).loadbalancer.LoadBalancer—http.Handler, который на каждый запрос беретNext()и делегируетServeHTTPвыбранному прокси.health.ProxyHealth— отдельная сущность для фоновой проверки доступности origin по таймеру.
- Round Robin: циклический проход по списку прокси (атомарный индекс).
- Weighted Round Robin: держит текущий backend и счетчик запросов; переключается, когда достигнут
weight. - Least Connections: делает копию списка, сортирует по
GetLoad()и берет наименее загруженный доступный. - Random: случайный индекс (seed передается снаружи).
В репозитории также есть демонстрационный
main.go, который создает балансировщик и запускает тестовые сервера (см.main.go).
Go, net/http, httputil.ReverseProxy, sync/atomic, goroutines, mutex, TCP health-check (DialTimeout).