You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

41 lines
1.0 KiB

package client
import (
"context"
"google.golang.org/grpc"
"sync"
)
type GrpcDirectClientFactory struct {
defaultOpts []grpc.DialOption
clientCache *sync.Map
}
func NewGrpcDirectClientFactory(defaultOpts ...grpc.DialOption) *GrpcDirectClientFactory {
return &GrpcDirectClientFactory{
defaultOpts: defaultOpts,
clientCache: &sync.Map{},
}
}
func (f *GrpcDirectClientFactory) NewConn(ctx context.Context, addr string, opts ...grpc.DialOption) (*grpc.ClientConn, error) {
dialOpts := make([]grpc.DialOption, 0, len(f.defaultOpts)+len(opts))
dialOpts = append(dialOpts, f.defaultOpts...)
dialOpts = append(dialOpts, opts...)
return grpc.DialContext(ctx, addr, dialOpts...)
}
func (f *GrpcDirectClientFactory) GetConn(ctx context.Context, addr string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) {
val, ok := f.clientCache.Load(addr)
if ok {
conn = val.(*grpc.ClientConn)
return
}
conn, err = f.NewConn(ctx, addr, opts...)
if err != nil {
return
}
f.clientCache.Store(addr, conn)
return
}