增加第一个简版的轮询负载均衡

This commit is contained in:
2021-10-19 14:48:46 +08:00
parent 3aaffbeab2
commit 75b557b07f
6 changed files with 178 additions and 2 deletions

55
balance/base.go Normal file
View File

@ -0,0 +1,55 @@
// Package balance...
//
// Description : balance...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-10-19 2:26 下午
package balance
import "sync"
// base ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:26 下午 2021/10/19
type base struct {
lock *sync.RWMutex
}
// Lock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:27 下午 2021/10/19
func (b *base) Lock() {
b.lock.Lock()
}
// Unlock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:27 下午 2021/10/19
func (b *base) Unlock() {
b.lock.Unlock()
}
// RLock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:28 下午 2021/10/19
func (b *base) RLock() {
b.lock.RLock()
}
// RUnlock ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:28 下午 2021/10/19
func (b *base) RUnlock() {
b.lock.RUnlock()
}

19
balance/define/base.go Normal file
View File

@ -0,0 +1,19 @@
// Package define...
//
// Description : define...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-10-19 12:43 下午
package define
const (
// ServerNodeStatusNormal 服务节点状态正常
ServerNodeStatusNormal = 0
// ServerNodeStatusLoss 探活逻辑无法和服务建立连接
ServerNodeStatusLoss = 1
// ServerNodeStatusException 指定时间区间内出现过多 5xx
ServerNodeStatusException = 2
// ServerNodeStatusRemove 通过调用函数的方法,将节点移除
ServerNodeStatusRemove = 3
)

20
balance/define/node.go Normal file
View File

@ -0,0 +1,20 @@
// Package define...
//
// Description : define...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-10-19 12:36 下午
package define
// ServerNode 服务器节点的定义
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 12:36 下午 2021/10/19
type ServerNode struct {
HostIP string `json:"host_ip"` // 机器IP
Port int `json:"port"` // 机器端口
Status int `json:"status"` // 机器状态
Weight int `json:"weight"` // 机器权重
}

76
balance/poll.go Normal file
View File

@ -0,0 +1,76 @@
// Package balance ...
//
// Description : 轮询机制的负载均衡
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-10-19 12:35 下午
package balance
import (
"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) (*Poll, error) {
if nil == serverList || len(serverList) == 0 {
return nil, errors.New("server list is empty")
}
return &Poll{
base: base{
lock: &sync.RWMutex{},
},
serverList: serverList,
currentServerIndex: 0,
}, nil
}
// Poll ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 12:41 下午 2021/10/19
type Poll struct {
base
serverList []*define.ServerNode
currentServerIndex int
}
// GetServerNode 获取服务节点
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 12:43 下午 2021/10/19
func (p *Poll) GetServerNode() (*define.ServerNode, error) {
if len(p.serverList) == 0 {
return nil, errors.New("server list is empty")
}
p.Lock()
defer p.Unlock()
var (
serverNode *define.ServerNode
)
// 循环次数
loopTimes := 0
for loopTimes < len(p.serverList) {
loopTimes++
p.currentServerIndex = (p.currentServerIndex + 1) % len(p.serverList)
if serverNode = p.serverList[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
}