Files
demo/examples/other/load_balance/load_balance.go
2025-03-14 18:50:49 +00:00

68 lines
1.3 KiB
Go

package main
import (
"log"
"net/http"
"github.com/darkit/goproxy"
"github.com/darkit/goproxy/pkg/loadbalance"
)
// LoadBalanceDelegate 负载均衡委托
type LoadBalanceDelegate struct {
goproxy.DefaultDelegate
lb loadbalance.LoadBalancer
}
// ResolveBackend 解析后端服务器
func (d *LoadBalanceDelegate) ResolveBackend(req *http.Request) (string, error) {
backend, err := d.lb.Next(req.URL.Host)
if err != nil {
return "", err
}
if backend == nil {
return "", nil
}
return backend.String(), nil
}
// 运行负载均衡代理服务器
func main() {
// 创建后端服务器列表
backends := []string{
"http://backend1:8081",
"http://backend2:8082",
"http://backend3:8083",
}
// 创建负载均衡器
lb := loadbalance.NewRoundRobinBalancer()
// 添加后端服务器
for _, backend := range backends {
if err := lb.Add(backend, 1); err != nil {
log.Fatalf("Error: %v", err)
return
}
}
// 创建负载均衡委托
delegate := &LoadBalanceDelegate{
lb: lb,
}
// 创建代理实例
proxy := goproxy.NewProxy(
goproxy.WithDelegate(delegate),
goproxy.WithLoadBalancer(lb),
)
// 启动代理服务器
log.Println("负载均衡代理服务器启动在 :8080")
log.Println("后端服务器列表:")
for _, backend := range backends {
log.Printf("- %s\n", backend)
}
http.ListenAndServe(":8080", proxy)
}