nps/lib/lb/lb.go
2022-01-23 17:30:38 +08:00

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
}