...
1 package lb
2
3 import (
4 "sync/atomic"
5
6 "github.com/go-kit/kit/endpoint"
7 "github.com/go-kit/kit/sd"
8 )
9
10
11 func NewRoundRobin(s sd.Endpointer) Balancer {
12 return &roundRobin{
13 s: s,
14 c: 0,
15 }
16 }
17
18 type roundRobin struct {
19 s sd.Endpointer
20 c uint64
21 }
22
23 func (rr *roundRobin) Endpoint() (endpoint.Endpoint, error) {
24 endpoints, err := rr.s.Endpoints()
25 if err != nil {
26 return nil, err
27 }
28 if len(endpoints) <= 0 {
29 return nil, ErrNoEndpoints
30 }
31 old := atomic.AddUint64(&rr.c, 1) - 1
32 idx := old % uint64(len(endpoints))
33 return endpoints[idx], nil
34 }
35
View as plain text