blob: 39897ffe31bf3a03670b976ae4432c9d4c3436ab [file] [log] [blame]
// Copyright 2017 The Goma Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
Package rpc provides goma specific rpc features on gRPC.
Load balancing RPC client
gRPC doesn't provide good loadbalancing client (for kubernetes, yet).
Typical gRPC client could be created as follows:
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
defer conn.Close()
c := pb.NewGreeterClient(conn)
This package provides load balancing client if address has multiple IP
type GreeterClient struct {
c *rpc.Client
func NewGreeterClient(address string, opts ...grpc.DialOption) GreeterClient {
return GreeterClient{
c: rpc.NewClient(address,
func(cc *grpc.ClientConn) interface{} {
return pb.NewGreeterClient(cc)
}, opts...),
func (c GreeterClient) SayHello(ctx context.Context, in *pb.Req, opts...grpc.CallOption) (*pb.Resp, error) {
var resp *pb.Resp
var err error
err = c.Call(ctx, c.client.Pick, "",
func(client interface{}) error {
resp, err = client.(GreeterClient).SayHello(ctx, in, opts...)
return err
return resp, err
c := NewGreeterClient(address, grpc.WithInsecure())
rpc call would return codes.Unavailable if no backends available for address.
TODO: use grpc's Balancer?
TODO: use statefulset for sharding?
package rpc