github.com/projecteru2/core@v0.0.0-20240321043226-06bcc1c23f58/client/client.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/projecteru2/core/auth"
     8  	"github.com/projecteru2/core/client/interceptor"
     9  	_ "github.com/projecteru2/core/client/resolver/eru"    // register grpc resolver: eru://
    10  	_ "github.com/projecteru2/core/client/resolver/static" // register grpc resolver: static://
    11  	pb "github.com/projecteru2/core/rpc/gen"
    12  	"github.com/projecteru2/core/types"
    13  
    14  	"google.golang.org/grpc"
    15  	"google.golang.org/grpc/credentials/insecure"
    16  	"google.golang.org/grpc/keepalive"
    17  )
    18  
    19  // Client contain grpc conn
    20  type Client struct {
    21  	addr string
    22  	conn *grpc.ClientConn
    23  }
    24  
    25  // NewClient new a client
    26  func NewClient(ctx context.Context, addr string, authConfig types.AuthConfig) (*Client, error) {
    27  	cc, err := dial(ctx, addr, authConfig)
    28  	return &Client{
    29  		addr: addr,
    30  		conn: cc,
    31  	}, err
    32  }
    33  
    34  // GetConn return connection
    35  func (c *Client) GetConn() *grpc.ClientConn {
    36  	return c.conn
    37  }
    38  
    39  // GetRPCClient return rpc client
    40  func (c *Client) GetRPCClient() pb.CoreRPCClient {
    41  	return pb.NewCoreRPCClient(c.conn)
    42  }
    43  
    44  func dial(ctx context.Context, addr string, authConfig types.AuthConfig) (*grpc.ClientConn, error) {
    45  	opts := []grpc.DialOption{
    46  		grpc.WithTransportCredentials(insecure.NewCredentials()),
    47  		grpc.WithKeepaliveParams(keepalive.ClientParameters{Time: 6 * 60 * time.Second, Timeout: time.Second}),
    48  		grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy":"round_robin"}`), // This sets the initial balancing policy, see https://github.com/grpc/grpc-go/blob/v1.40.x/examples/features/load_balancing/client/main.go
    49  		grpc.WithUnaryInterceptor(interceptor.NewUnaryRetry(interceptor.RetryOptions{Max: 0})),
    50  		grpc.WithStreamInterceptor(interceptor.NewStreamRetry(interceptor.RetryOptions{Max: 0})),
    51  	}
    52  	if authConfig.Username != "" {
    53  		opts = append(opts, grpc.WithPerRPCCredentials(auth.NewCredential(authConfig)))
    54  	}
    55  
    56  	return grpc.DialContext(ctx, addr, opts...)
    57  }