balance/implement/weight_round_robin.go

43 lines
1.2 KiB
Go

// Package implement ...
//
// Description : implement ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2025-05-23 23:24
package implement
import (
"git.zhangdeman.cn/gateway/balance/abstract"
"git.zhangdeman.cn/gateway/balance/define"
"git.zhangdeman.cn/zhangdeman/exception"
)
func NewWeightRoundRobin() abstract.IBalance {
return &WeightRoundRobin{}
}
// WeightRoundRobin 加权轮询选择机器
type WeightRoundRobin struct {
}
func (w *WeightRoundRobin) Get(nodeList []*define.SeverNode) (*define.SeverNode, exception.IException) {
totalWeight := int64(0)
var selectedNode *define.SeverNode
// 计算总权重
for _, node := range nodeList {
node.CurrentWeight = node.CurrentWeight + node.EffectiveWeight // 每个节点的当前权重
totalWeight += node.EffectiveWeight // 总权重是有效权重的累加. 配置的权重只是初始权重
if nil == selectedNode {
selectedNode = node
} else {
if node.CurrentWeight > selectedNode.CurrentWeight {
selectedNode = node
}
}
}
// 当前选中节点权重重置
selectedNode.CurrentWeight = selectedNode.CurrentWeight - totalWeight
return selectedNode, nil
}