refactoring
This commit is contained in:
@@ -1,12 +1,20 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/keepalive"
|
||||
)
|
||||
|
||||
var (
|
||||
// cache grpc connections
|
||||
grpcClients = make(map[string]*grpc.ClientConn)
|
||||
grpcClientsLock sync.Mutex
|
||||
)
|
||||
|
||||
func NewGrpcServer() *grpc.Server {
|
||||
return grpc.NewServer(grpc.KeepaliveParams(keepalive.ServerParameters{
|
||||
Time: 10 * time.Second, // wait time before ping if no activity
|
||||
@@ -26,3 +34,32 @@ func GrpcDial(address string, opts ...grpc.DialOption) (*grpc.ClientConn, error)
|
||||
|
||||
return grpc.Dial(address, opts...)
|
||||
}
|
||||
|
||||
func WithCachedGrpcClient(fn func(*grpc.ClientConn) error, address string, opts ...grpc.DialOption) error {
|
||||
|
||||
grpcClientsLock.Lock()
|
||||
|
||||
existingConnection, found := grpcClients[address]
|
||||
if found {
|
||||
grpcClientsLock.Unlock()
|
||||
return fn(existingConnection)
|
||||
}
|
||||
|
||||
grpcConnection, err := GrpcDial(address, opts...)
|
||||
if err != nil {
|
||||
grpcClientsLock.Unlock()
|
||||
return fmt.Errorf("fail to dial %s: %v", address, err)
|
||||
}
|
||||
|
||||
grpcClients[address] = grpcConnection
|
||||
grpcClientsLock.Unlock()
|
||||
|
||||
err = fn(grpcConnection)
|
||||
if err != nil {
|
||||
grpcClientsLock.Lock()
|
||||
delete(grpcClients, address)
|
||||
grpcClientsLock.Unlock()
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user