selector.go 689 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package registry
  2. import (
  3. "context"
  4. "errors"
  5. )
  6. var (
  7. ErrServiceUnavailable = errors.New("service unavailable")
  8. )
  9. const (
  10. StatusHealthy = "healthy"
  11. StatusDead = "dead"
  12. )
  13. type (
  14. Selector struct {
  15. registry Registry
  16. }
  17. )
  18. func (selector *Selector) Select(ctx context.Context, name string) (node *ServiceNode, err error) {
  19. var (
  20. nodes []*ServiceNode
  21. )
  22. if nodes, err = selector.registry.Get(ctx, name); err != nil {
  23. return
  24. }
  25. for _, nv := range nodes {
  26. if nv.Status == StatusHealthy {
  27. node = nv
  28. break
  29. }
  30. }
  31. if node == nil {
  32. err = ErrServiceUnavailable
  33. }
  34. return
  35. }
  36. func NewSelector(registry Registry) *Selector {
  37. return &Selector{
  38. registry: registry,
  39. }
  40. }