68 lines
1.3 KiB
Go
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)
|
|
}
|