Skip to content

Commit 4ac0bbc

Browse files
authored
gRPC load balancing (#7133)
* gRPC load balancing * Fix typo * Merge branch 'master' into 5132-gRPC-client-load-balancing * Add doc about load balancer * Update validator/client/multiple_endpoints_grpc_resolver.go * Merge branch 'master' into 5132-gRPC-client-load-balancing * gofmt * Merge branch 'master' into 5132-gRPC-client-load-balancing * Merge branch 'master' into 5132-gRPC-client-load-balancing
1 parent c0c34f3 commit 4ac0bbc

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

validator/client/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ go_library(
1010
"log.go",
1111
"metrics.go",
1212
"mock_validator.go",
13+
"multiple_endpoints_grpc_resolver.go",
1314
"propose.go",
1415
"propose_protect.go",
1516
"runner.go",
@@ -60,6 +61,7 @@ go_library(
6061
"@org_golang_google_grpc//codes:go_default_library",
6162
"@org_golang_google_grpc//credentials:go_default_library",
6263
"@org_golang_google_grpc//metadata:go_default_library",
64+
"@org_golang_google_grpc//resolver:go_default_library",
6365
"@org_golang_google_grpc//status:go_default_library",
6466
],
6567
)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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() {}

validator/client/service.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ func ConstructDialOptions(
346346
grpc_prometheus.StreamClientInterceptor,
347347
grpc_retry.StreamClientInterceptor(),
348348
),
349+
grpc.WithResolvers(&multipleEndpointsGrpcResolverBuilder{}),
349350
}
350351

351352
dialOpts = append(dialOpts, extraOpts...)

0 commit comments

Comments
 (0)