Golang 實現隨機負載均衡
負載均衡簡介
從設備
角度實現負載均衡:
-
硬件負載均衡:
由專門的
負載均衡器
服務提供商,在你的服務器和外部網絡之間架設 服務商的負載均衡器
。服務商提供設備和方案幫你處理流量的均衡,不過因爲比較費錢包國內沒什麼人用
-
軟件負載均衡:
包括家喻戶曉的
Nginx
,LVS
,Tengine(阿里版Nginx)
。優點就是成本比較低,但需要運維去配置、維護。會踩坑,但國內都在用基本上網找就有解決方案
。
隨機負載均衡
無論是Nginx
,LVS
均衡負載的核心在於 網絡 io 複用
,負載均衡算法
。其中均衡算法又分爲 隨機
,輪詢
,加權輪詢
,哈希
,而隨機負載均衡算法
就是本文的重點。
隨機負載均衡:意味沒有規律,隨機在服務器隊列
中獲得一臺服務器處理請求。其代碼實現如下:
package main
import (
"fmt"
"math/rand"
)
// 接口定義
type LoadBalance interface {
//選擇一個後端Server
//參數remove是需要排除選擇的後端Server
Next(remove []string) *Server
//更新可用Server列表
UpdateServers(servers []*Server)
}
// 後端Server定義
type Server struct {
//主機地址
Host string
//主機名
Name string
Id int
//主機是否在線
Online bool
}
type LoadBalanceRandom struct{
servers []*Server
}
// 實例化 隨機均衡負載
func NewLoadBalanceRandom(servers []*Server) *LoadBalanceRandom{
newBalance := &LoadBalanceRandom{}
newBalance.UpdateServers(servers)
return newBalance
}
//選擇一個後端Server
func (r *LoadBalanceRandom) Next() *Server {
if len(r.servers) == 0 {
return nil
}
curIndex := rand.Intn(len(r.servers))
return r.servers[curIndex]
}
func (r *LoadBalanceRandom) Get(key string) (*Server, error) {
return r.Next(), nil
}
//系統運行過程中,後端可用Server會更新
func (this *LoadBalanceRandom) UpdateServers(servers []*Server) {
newServers:=make([]*Server,0)
for _,e:=range servers {
if e.Online==true {
newServers=append(newServers,e)
}
}
this.servers=newServers
}
測試 隨機負載均衡
func main() {
count:=make([]int,4)
servers:=make([]*Server,0)
servers=append(servers,&Server{Host:"1",Id:0,Online:true})
servers=append(servers,&Server{Host:"2",Id:1,Online:true})
servers=append(servers,&Server{Host:"3",Id:2,Online:true})
servers=append(servers,&Server{Host:"4",Id:3,Online:true})
lb:=NewLoadBalanceRandom(servers)
// 創建4個Server,隨機選擇100000次。查看4臺機器 被選中次數
for i:=0;i<100000;i++{
c:=lb.Next()
count[c.Id]++
}
fmt.Println(count)
}
輸出
// 4 個服務器選擇的次數都是相對平均
[25058 24947 25105 24890]
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/WrxpIBt-xRpZwHS3EIFkFw