gopkg/balance/poll.go

74 lines
1.5 KiB
Go

// Package balance ...
//
// Description : 轮询机制的负载均衡
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-10-19 12:35 下午
package balance
import (
"net/http"
"sync"
"git.zhangdeman.cn/zhangdeman/gopkg/balance/define"
"github.com/pkg/errors"
)
// NewPoll 获取轮询实例
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 12:40 下午 2021/10/19
func NewPoll(serverList []*define.ServerNode) (IBalance, error) {
if nil == serverList || len(serverList) == 0 {
return nil, errors.New("server list is empty")
}
return &Poll{
base: base{
lock: &sync.RWMutex{},
severList: serverList,
},
currentServerIndex: 0,
}, nil
}
// Poll ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 12:41 下午 2021/10/19
type Poll struct {
base
currentServerIndex int
}
// GetServerNode 获取服务节点
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 12:43 下午 2021/10/19
func (p *Poll) GetServerNode(req *http.Request) (*define.ServerNode, error) {
p.RLock()
defer p.RUnlock()
var (
serverNode *define.ServerNode
)
// 循环次数
loopTimes := 0
for loopTimes < len(p.severList) {
loopTimes++
p.currentServerIndex = (p.currentServerIndex + 1) % len(p.severList)
if serverNode = p.severList[p.currentServerIndex]; serverNode.Status != define.ServerNodeStatusNormal {
continue
}
break
}
if nil == serverNode || serverNode.Status != define.ServerNodeStatusNormal {
return nil, errors.New("has no server node be used")
}
return serverNode, nil
}