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() {}