118 lines
2.2 KiB
Go
118 lines
2.2 KiB
Go
// Package balance ...
|
|
//
|
|
// Description : 接口定义
|
|
//
|
|
// Author : go_developer@163.com<张德满>
|
|
//
|
|
// Date : 2021-04-01 2:43 下午
|
|
package balance
|
|
|
|
import (
|
|
"git.zhangdeman.cn/gateway/balance/abstract"
|
|
"git.zhangdeman.cn/gateway/balance/define"
|
|
"git.zhangdeman.cn/zhangdeman/exception"
|
|
"reflect"
|
|
"sync"
|
|
)
|
|
|
|
// NewServer ...
|
|
//
|
|
// Author : go_developer@163.com<张德满>
|
|
//
|
|
// Date : 6:51 下午 2021/4/1
|
|
func NewServer(nodeList []*define.SeverNode, d abstract.IBalance) *Server {
|
|
return &Server{
|
|
lock: &sync.RWMutex{},
|
|
NodeList: nodeList,
|
|
Balance: d,
|
|
}
|
|
}
|
|
|
|
// Server server 的具体配置
|
|
//
|
|
// Author : go_developer@163.com<张德满>
|
|
//
|
|
// Date : 2:59 下午 2021/4/1
|
|
type Server struct {
|
|
lock *sync.RWMutex
|
|
NodeList []*define.SeverNode
|
|
Balance abstract.IBalance
|
|
}
|
|
|
|
// Add 添加一个Server
|
|
//
|
|
// Author : go_developer@163.com<张德满>
|
|
//
|
|
// Date : 3:00 下午 2021/4/1
|
|
func (s *Server) Add(node *define.SeverNode) {
|
|
s.lock.Lock()
|
|
defer func() {
|
|
s.lock.Unlock()
|
|
}()
|
|
s.NodeList = append(s.NodeList, node)
|
|
}
|
|
|
|
// Remove 移除一个server
|
|
//
|
|
// Author : go_developer@163.com<张德满>
|
|
//
|
|
// Date : 5:09 下午 2021/4/1
|
|
func (s *Server) Remove(nodeID string) {
|
|
s.lock.Lock()
|
|
defer func() {
|
|
s.lock.Unlock()
|
|
}()
|
|
for nodeIndex, item := range s.NodeList {
|
|
if item.ID == nodeID {
|
|
s.NodeList = append(s.NodeList[0:nodeIndex], s.NodeList[nodeIndex:]...)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get 按照指定策略获取一台机器
|
|
//
|
|
// Author : go_developer@163.com<张德满>
|
|
//
|
|
// Date : 5:17 下午 2021/4/1
|
|
func (s *Server) Get() (string, exception.IException) {
|
|
s.lock.RLock()
|
|
defer func() {
|
|
s.lock.RUnlock()
|
|
}()
|
|
return s.Balance.Get(s.NodeList)
|
|
}
|
|
|
|
func (s *Server) Modify(node *define.SeverNode) {
|
|
if nil == node {
|
|
return
|
|
}
|
|
s.lock.RLock()
|
|
defer func() {
|
|
s.lock.RUnlock()
|
|
}()
|
|
findExistNode := false
|
|
for nodeIndex, item := range s.NodeList {
|
|
if item.ID == node.ID {
|
|
s.NodeList[nodeIndex] = node
|
|
findExistNode = true
|
|
break
|
|
}
|
|
}
|
|
if !findExistNode {
|
|
// 没找到已存在节点, 自动降级为添加
|
|
s.Add(node)
|
|
}
|
|
}
|
|
|
|
// ChangeBalance 修改负载均衡策略
|
|
func (s *Server) ChangeBalance(d abstract.IBalance) {
|
|
if nil == d {
|
|
return
|
|
}
|
|
if reflect.ValueOf(d).IsNil() {
|
|
return
|
|
}
|
|
s.Balance = d
|
|
}
|