负载均衡算法
随机分配
缺点:
随机取适用的场景是:各服务器处理能力都差不多(实际上是不太可能的)
不能满足我们 "能者多劳" 的诉求
func main() {
servers := []string{
"127.0.0.1:8080",
"127.0.0.1:8081",
"127.0.0.1:8082",
"127.0.0.1:8083",
"127.0.0.1:8084",
"127.0.0.1:8085",}
for i := 0; i < 10; i++ {
fmt.Println(getServer1(servers))
}
}
func getServer1(servers []string) string {
return servers[rand.Intn(len(servers))]
加权随机分配(能者多劳)
func main() {
servers_m := map[string]int{
"127.0.0.1:8080": 2,
"127.0.0.1:8081": 8,
"127.0.0.1:8082": 1,
"127.0.0.1:8083": 9,
"127.0.0.1:8084": 4,
"127.0.0.1:8085": 6,
}
m := make(map[string]int)
for i := 0; i < 10000; i++ {
ip := getServer2(servers_m)
v, ok := m[ip]
if ok {
m[ip] = v + 1
} else {
m[ip] = 1
}
}
fmt.Printf("%+v", m)
}
func getServer2(servers map[string]int) string {
// 所有权重总和,作为坐标轴
var totalWeight int
for _, v := range servers {
totalWeight += v
}
// 随机生成坐标点
offset := rand.Intn(totalWeight)
// 找寻坐标点在坐标轴的位置 以及对应的IP
for ip, weight := range servers {
if offset < weight {
return ip
}
offset -= weight
}
return ""
}
// 控制台打印结果
map[
127.0.0.1:8080:643
127.0.0.1:8081:2723
127.0.0.1:8082:346
127.0.0.1:8083:2970
127.0.0.1:8084:1337
127.0.0.1:8085:1981
]
加权轮询
代码是有问题的,golang没有LinkedHash