mirror of
https://github.com/ehang-io/nps.git
synced 2025-07-03 21:20:41 +00:00
60 lines
1.0 KiB
Go
60 lines
1.0 KiB
Go
package lb
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
)
|
|
|
|
func NewLoadBalancer() *LoadBalancer {
|
|
return &LoadBalancer{
|
|
instances: make(map[string]Algo, 0),
|
|
}
|
|
}
|
|
|
|
type LoadBalancer struct {
|
|
instances map[string]Algo
|
|
Algo string
|
|
sync.RWMutex
|
|
}
|
|
|
|
func (lb *LoadBalancer) SetClient(id string, instance interface{}) error {
|
|
lb.Lock()
|
|
defer lb.Unlock()
|
|
var l Algo
|
|
var ok bool
|
|
if l, ok = lb.instances[id]; !ok {
|
|
l = GetLbAlgo(lb.Algo)
|
|
lb.instances[id] = l
|
|
}
|
|
return l.Append(instance)
|
|
}
|
|
|
|
func (lb *LoadBalancer) RemoveClient(id string, instance interface{}) error {
|
|
lb.Lock()
|
|
defer lb.Unlock()
|
|
var l Algo
|
|
var ok bool
|
|
if l, ok = lb.instances[id]; !ok {
|
|
return errors.New("not found Client")
|
|
}
|
|
err := l.Remove(instance)
|
|
if l.Empty() {
|
|
delete(lb.instances, id)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (lb *LoadBalancer) GetClient(id string) (interface{}, error) {
|
|
lb.Lock()
|
|
l, ok := lb.instances[id]
|
|
lb.Unlock()
|
|
if !ok {
|
|
return nil, errors.New("client can not found")
|
|
}
|
|
i, err := l.Next()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return i, nil
|
|
}
|