// 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 }