|
| 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 | +func (*multipleEndpointsGrpcResolverBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { |
| 18 | + r := &multipleEndpointsGrpcResolver{ |
| 19 | + target: target, |
| 20 | + cc: cc, |
| 21 | + } |
| 22 | + r.start() |
| 23 | + return r, nil |
| 24 | +} |
| 25 | + |
| 26 | +func (*multipleEndpointsGrpcResolverBuilder) Scheme() string { |
| 27 | + return resolver.GetDefaultScheme() |
| 28 | +} |
| 29 | + |
| 30 | +type multipleEndpointsGrpcResolver struct { |
| 31 | + target resolver.Target |
| 32 | + cc resolver.ClientConn |
| 33 | +} |
| 34 | + |
| 35 | +func (r *multipleEndpointsGrpcResolver) start() { |
| 36 | + endpoints := strings.Split(r.target.Endpoint, ",") |
| 37 | + var addrs []resolver.Address |
| 38 | + for _, endpoint := range endpoints { |
| 39 | + addrs = append(addrs, resolver.Address{Addr: endpoint}) |
| 40 | + } |
| 41 | + r.cc.UpdateState(resolver.State{Addresses: addrs}) |
| 42 | +} |
| 43 | + |
| 44 | +func (*multipleEndpointsGrpcResolver) ResolveNow(o resolver.ResolveNowOptions) {} |
| 45 | + |
| 46 | +func (*multipleEndpointsGrpcResolver) Close() {} |
0 commit comments