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.
42 lines
1.1 KiB
42 lines
1.1 KiB
package client |
|
|
|
import ( |
|
"context" |
|
"sync" |
|
|
|
"google.golang.org/grpc" |
|
) |
|
|
|
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.NewClient(addr, dialOpts...) |
|
// 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 |
|
}
|
|
|