Golang 实现加权轮询负载均衡

3,344 阅读1分钟

这是我参与更文挑战的第17天,活动详情查看:更文挑战

如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。[更多系列文章在我博客] coderdao.github.io/

Golang 实现加权轮询负载均衡

实现加权轮询负载均衡思路

代码实现一个加权负载均衡

  • Weight 初始化时对节点约定的权重
  • currentWeight 节点临时权重,每轮都会变化
  • effectiveWeight 节点有效权重,默认与Weight相同
  • totalWeight 所有节点有效权重之和:sum(effectiveWeight)

代码实现一个加权负载均衡

  1. currentWeight = currentWeight+effecitveWeight
  2. 选中最大的 currentWeight 节点为选中节点
  3. currentWeight = currentWeight-totalWeight (4+3+2=9)

所以我们能够 在表格模拟运行情况:

请求次数请求前currentWelght选中的节点请求后currentWelght
1[serverA=4,serverB=3,serverC=2]serverA[serverA=-1,serverB=6,serverC=4]
2[serverA=-1,serverB=6,serverC=4]serverB[serverA=3,serverB=0,serverC=6]
3[serverA=3,serverB=0,serverC=6]serverc[serverA=7,serverB=3,serverC=-1]
4[serverA=7,serverB=3,serverC=-1]serverA[serverA=2,serverB=6,serverC=1]
5[serverA=2,serverB=6,serverC=1]serverB[serverA=6,serverB=0,serverC=3]
6[serverA=6,serverB=0,serverC=3]serverA[serverA=1,serverB=3,serverC=5]
7[serverA=1,serverB=3,serverC=5]serverc[serverA=5,serverB=6,serverC=-2]

加权轮询负载均衡代码

图片描述

测试代码

图片描述

测试结果

$ go test
2021/06/18 19:17:57 Failed to connect to 127.0.0.1:2181: dial tcp 127.0.0.1:2181: i/o timeout
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2003
127.0.0.1:2005
PASS
ok      gateway/pratise/proxy/load_balance      1.124s

从测试结果我们可以看出,2003 为 2005 的两倍,符合权重设置结果