ReverseProxy 源码分析
拓展ReverseProxy功能
四种负载均衡
-
随机负载均衡:随机挑选目标服务器的IP
random.go
packeage load_balance // 随机负载均衡 type RandomBalance struct { curIndex int rss []string //目标服务器的数组 //conf LoadBalanceConf //观察主体,用于服务发现 } func (r *RandomBalance) Add(params ...string) error { if len(params) == 0 { return errors.New("param len 1 at least") } addr := params[0] r.rss = append(r.rss, addr) return nil } func (r *RandomBalance) Next() string { if len(r.rss) == 0 { return "" } r.curIndex = rand.Intn(len(r.rss)) return r.rss[r.curIndex] }
random_test.go
func TestRandomBalance(t *testing.T) { rb := &RandomBalance{ } rb.Add("127.0.0.1:2003") rb.Add("127.0.0.1:2004") rb.Add("127.0.0.1:2005") rb.Add("127.0.0.1:2006") fmt.Println(rb.Next()) fmt.Println(rb.Next()) fmt.Println(rb.Next()) fmt.Println(rb.Next()) } //-----------结果------------ === RUN TestRandomBalance 127.0.0.1:2004 127.0.0.1:2006 127.0.0.1:2006 127.0.0.1:2006 --- PASS: TestRandomBalance (0.00s) PASS
-
轮询负载均衡:ABC 三台服务器,ABCABC依次轮询
round_robin.go
packeage load_balance
//round_robin 轮询负载均衡
type RoundRobin struct {
curIndex int
rss []string //目标服务器的数组
}
func (r *RoundRobin) Add(params ...string) error {
if len(params) == 0 {
return errors.New("params len 1 at least")
}
addr := params[0]
r.rss = append(r.rss, addr)
return nil
}
// Next 获取下一个元素
func (r *RoundRobin) Next() string {
if len(r.rss) == 0 {
return ""
}
lens := len(r.rss) // 目标服务器的总数
if r.curIndex >= lens {
r.curIndex = 0
}
curAddr := r