Golang实现加权轮询负载均衡Golang实现加权轮

这是我参与更文挑战的第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 的两倍,符合权重设置结果