43 lines
1.1 KiB
Go
43 lines
1.1 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.Weight
|
|
if nil == selectedNode {
|
|
selectedNode = node
|
|
} else {
|
|
if node.CurrentWeight > selectedNode.CurrentWeight {
|
|
selectedNode = node
|
|
}
|
|
}
|
|
}
|
|
// 当前选中节点权重重置
|
|
selectedNode.CurrentWeight = selectedNode.CurrentWeight - totalWeight
|
|
return selectedNode, nil
|
|
}
|