OSDN Git Service

new repo
[bytom/vapor.git] / vendor / github.com / go-kit / kit / sd / lb / round_robin.go
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 // NewRoundRobin returns a load balancer that returns services in sequence.
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 }