lb.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package lb
  2. import (
  3. "errors"
  4. "sync"
  5. )
  6. func NewLoadBalancer() *LoadBalancer {
  7. return &LoadBalancer{
  8. instances: make(map[string]Algo, 0),
  9. }
  10. }
  11. type LoadBalancer struct {
  12. instances map[string]Algo
  13. Algo string
  14. sync.RWMutex
  15. }
  16. func (lb *LoadBalancer) SetClient(id string, instance interface{}) error {
  17. lb.Lock()
  18. defer lb.Unlock()
  19. var l Algo
  20. var ok bool
  21. if l, ok = lb.instances[id]; !ok {
  22. l = GetLbAlgo(lb.Algo)
  23. lb.instances[id] = l
  24. }
  25. return l.Append(instance)
  26. }
  27. func (lb *LoadBalancer) RemoveClient(id string, instance interface{}) error {
  28. lb.Lock()
  29. defer lb.Unlock()
  30. var l Algo
  31. var ok bool
  32. if l, ok = lb.instances[id]; !ok {
  33. return errors.New("not found Client")
  34. }
  35. err := l.Remove(instance)
  36. if l.Empty() {
  37. delete(lb.instances, id)
  38. }
  39. return err
  40. }
  41. func (lb *LoadBalancer) GetClient(id string) (interface{}, error) {
  42. lb.Lock()
  43. l, ok := lb.instances[id]
  44. lb.Unlock()
  45. if !ok {
  46. return nil, errors.New("client can not found")
  47. }
  48. i, err := l.Next()
  49. if err != nil {
  50. return nil, err
  51. }
  52. return i, nil
  53. }