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