roundrobin.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package roundrobin
  2. import (
  3. "context"
  4. "fmt"
  5. "math/rand"
  6. "sync"
  7. "time"
  8. "google.golang.org/grpc/balancer"
  9. "google.golang.org/grpc/balancer/base"
  10. "google.golang.org/grpc/resolver"
  11. )
  12. const Name = "zero_rr"
  13. func init() {
  14. balancer.Register(newRoundRobinBuilder())
  15. }
  16. type roundRobinPickerBuilder struct {
  17. }
  18. func newRoundRobinBuilder() balancer.Builder {
  19. return base.NewBalancerBuilder(Name, new(roundRobinPickerBuilder))
  20. }
  21. func (b *roundRobinPickerBuilder) Build(readySCs map[resolver.Address]balancer.SubConn) balancer.Picker {
  22. rand.Seed(time.Now().UnixNano())
  23. picker := &roundRobinPicker{
  24. index: rand.Int(),
  25. }
  26. for addr, conn := range readySCs {
  27. picker.conns = append(picker.conns, &subConn{
  28. addr: addr,
  29. conn: conn,
  30. })
  31. }
  32. return picker
  33. }
  34. type roundRobinPicker struct {
  35. conns []*subConn
  36. index int
  37. lock sync.Mutex
  38. }
  39. func (p *roundRobinPicker) Pick(ctx context.Context, info balancer.PickInfo) (
  40. conn balancer.SubConn, done func(balancer.DoneInfo), err error) {
  41. fmt.Println(p.conns)
  42. p.lock.Lock()
  43. defer p.lock.Unlock()
  44. p.index = (p.index + 1) % len(p.conns)
  45. return p.conns[p.index].conn, func(info balancer.DoneInfo) {
  46. }, nil
  47. }
  48. type subConn struct {
  49. addr resolver.Address
  50. conn balancer.SubConn
  51. }