1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package balancer
- import (
- "context"
- "math/rand"
- "sync"
- "time"
- "google.golang.org/grpc/balancer"
- "google.golang.org/grpc/balancer/base"
- "google.golang.org/grpc/resolver"
- )
- const Name = "roundrobin"
- func init() {
- balancer.Register(newBuilder())
- }
- type roundRobinPickerBuilder struct {
- }
- func newBuilder() balancer.Builder {
- return base.NewBalancerBuilder(Name, new(roundRobinPickerBuilder))
- }
- func (b *roundRobinPickerBuilder) Build(readySCs map[resolver.Address]balancer.SubConn) balancer.Picker {
- rand.Seed(time.Now().UnixNano())
- picker := &roundRobinPicker{
- index: rand.Int(),
- }
- for addr, conn := range readySCs {
- picker.conns = append(picker.conns, &subConn{
- addr: addr,
- conn: conn,
- })
- }
- return picker
- }
- type roundRobinPicker struct {
- conns []*subConn
- index int
- lock sync.Mutex
- }
- func (p *roundRobinPicker) Pick(ctx context.Context, info balancer.PickInfo) (
- conn balancer.SubConn, done func(balancer.DoneInfo), err error) {
- p.lock.Lock()
- defer p.lock.Unlock()
- p.index = (p.index + 1) % len(p.conns)
- return p.conns[p.index].conn, func(info balancer.DoneInfo) {
- }, nil
- }
- type subConn struct {
- addr resolver.Address
- conn balancer.SubConn
- }
|