增加第一个简版的轮询负载均衡
This commit is contained in:
55
balance/base.go
Normal file
55
balance/base.go
Normal 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
19
balance/define/base.go
Normal 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
20
balance/define/node.go
Normal 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
76
balance/poll.go
Normal 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
|
||||
}
|
Reference in New Issue
Block a user