rrclient.go 661 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package internal
  2. import (
  3. "math/rand"
  4. "sync"
  5. "time"
  6. "google.golang.org/grpc"
  7. )
  8. type RRClient struct {
  9. conns []*grpc.ClientConn
  10. index int
  11. lock sync.Mutex
  12. }
  13. func NewRRClient(endpoints []string) (*RRClient, error) {
  14. var conns []*grpc.ClientConn
  15. for _, endpoint := range endpoints {
  16. conn, err := dial(endpoint)
  17. if err != nil {
  18. return nil, err
  19. }
  20. conns = append(conns, conn)
  21. }
  22. rand.Seed(time.Now().UnixNano())
  23. return &RRClient{
  24. conns: conns,
  25. index: rand.Intn(len(conns)),
  26. }, nil
  27. }
  28. func (c *RRClient) Next() *grpc.ClientConn {
  29. c.lock.Lock()
  30. defer c.lock.Unlock()
  31. c.index = (c.index + 1) % len(c.conns)
  32. return c.conns[c.index]
  33. }