github.com/prysmaticlabs/prysm@v1.4.4/validator/client/multiple_endpoints_grpc_resolver.go (about)

     1  package client
     2  
     3  import (
     4  	"strings"
     5  
     6  	"google.golang.org/grpc/resolver"
     7  )
     8  
     9  // Modification of a default grpc passthrough resolver (google.golang.org/grpc/resolver/passthrough) allowing to use multiple addresses
    10  // in grpc endpoint. Example:
    11  // conn, err := grpc.DialContext(ctx, "127.0.0.1:4000,127.0.0.1:4001", grpc.WithInsecure(), grpc.WithResolvers(&multipleEndpointsGrpcResolverBuilder{}))
    12  // It can be used with any grpc load balancer (pick_first, round_robin). Default is pick_first.
    13  // Round robin can be used by adding the following option:
    14  // grpc.WithDefaultServiceConfig("{\"loadBalancingConfig\":[{\"round_robin\":{}}]}")
    15  type multipleEndpointsGrpcResolverBuilder struct{}
    16  
    17  // Build creates and starts multiple endpoints resolver.
    18  func (*multipleEndpointsGrpcResolverBuilder) Build(target resolver.Target, cc resolver.ClientConn, _ resolver.BuildOptions) (resolver.Resolver, error) {
    19  	r := &multipleEndpointsGrpcResolver{
    20  		target: target,
    21  		cc:     cc,
    22  	}
    23  	r.start()
    24  	return r, nil
    25  }
    26  
    27  // Scheme returns default scheme.
    28  func (*multipleEndpointsGrpcResolverBuilder) Scheme() string {
    29  	return resolver.GetDefaultScheme()
    30  }
    31  
    32  type multipleEndpointsGrpcResolver struct {
    33  	target resolver.Target
    34  	cc     resolver.ClientConn
    35  }
    36  
    37  func (r *multipleEndpointsGrpcResolver) start() {
    38  	endpoints := strings.Split(r.target.Endpoint, ",")
    39  	var addrs []resolver.Address
    40  	for _, endpoint := range endpoints {
    41  		addrs = append(addrs, resolver.Address{Addr: endpoint})
    42  	}
    43  	r.cc.UpdateState(resolver.State{Addresses: addrs})
    44  }
    45  
    46  // ResolveNow --
    47  func (*multipleEndpointsGrpcResolver) ResolveNow(_ resolver.ResolveNowOptions) {}
    48  
    49  // Close --
    50  func (*multipleEndpointsGrpcResolver) Close() {}