* * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http:www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *
Package roundrobin defines a roundrobin balancer. Roundrobin balancer is installed as one of the default balancers in gRPC, users don't need to explicitly install this balancer.
package roundrobin

import (
	

	
	
	
	
)
Name is the name of round_robin balancer.
const Name = "round_robin"

var logger = grpclog.Component("roundrobin")
newBuilder creates a new roundrobin balancer builder.
func () balancer.Builder {
	return base.NewBalancerBuilder(Name, &rrPickerBuilder{}, base.Config{HealthCheck: true})
}

func () {
	balancer.Register(newBuilder())
}

type rrPickerBuilder struct{}

func (*rrPickerBuilder) ( base.PickerBuildInfo) balancer.Picker {
	logger.Infof("roundrobinPicker: newPicker called with info: %v", )
	if len(.ReadySCs) == 0 {
		return base.NewErrPicker(balancer.ErrNoSubConnAvailable)
	}
	var  []balancer.SubConn
	for  := range .ReadySCs {
		 = append(, )
	}
	return &rrPicker{
Start at a random index, as the same RR balancer rebuilds a new picker when SubConn states change, and we don't want to apply excess load to the first server in the list.
		next: grpcrand.Intn(len()),
	}
}

subConns is the snapshot of the roundrobin balancer when this picker was created. The slice is immutable. Each Get() will do a round robin selection from it and return the selected SubConn.