Bläddra i källkod

feat: support grpc client keepalive config (#2950)

Kevin Wan 2 år sedan
förälder
incheckning
dc5b8dd716
3 ändrade filer med 34 tillägg och 16 borttagningar
  1. 14 0
      zrpc/client.go
  2. 5 4
      zrpc/client_test.go
  3. 15 12
      zrpc/config.go

+ 14 - 0
zrpc/client.go

@@ -8,8 +8,11 @@ import (
 	"github.com/zeromicro/go-zero/zrpc/internal/auth"
 	"github.com/zeromicro/go-zero/zrpc/internal/clientinterceptors"
 	"google.golang.org/grpc"
+	"google.golang.org/grpc/keepalive"
 )
 
+const defaultClientKeepaliveTime = 20 * time.Second
+
 var (
 	// WithDialOption is an alias of internal.WithDialOption.
 	WithDialOption = internal.WithDialOption
@@ -62,6 +65,11 @@ func NewClient(c RpcClientConf, options ...ClientOption) (Client, error) {
 	if c.Timeout > 0 {
 		opts = append(opts, WithTimeout(time.Duration(c.Timeout)*time.Millisecond))
 	}
+	if c.KeepaliveTime > 0 {
+		opts = append(opts, WithDialOption(grpc.WithKeepaliveParams(keepalive.ClientParameters{
+			Time: c.KeepaliveTime,
+		})))
+	}
 
 	opts = append(opts, options...)
 
@@ -90,6 +98,12 @@ func NewClientWithTarget(target string, opts ...ClientOption) (Client, error) {
 		Timeout:    true,
 	}
 
+	opts = append([]ClientOption{
+		WithDialOption(grpc.WithKeepaliveParams(keepalive.ClientParameters{
+			Time: defaultClientKeepaliveTime,
+		})),
+	}, opts...)
+
 	return internal.NewClient(target, middlewares, opts...)
 }
 

+ 5 - 4
zrpc/client_test.go

@@ -113,10 +113,11 @@ func TestDepositServer_Deposit(t *testing.T) {
 	)
 	tarConfClient := MustNewClient(
 		RpcClientConf{
-			Target:  "foo",
-			App:     "foo",
-			Token:   "bar",
-			Timeout: 1000,
+			Target:        "foo",
+			App:           "foo",
+			Token:         "bar",
+			Timeout:       1000,
+			KeepaliveTime: time.Second * 15,
 			Middlewares: ClientMiddlewaresConf{
 				Trace:      true,
 				Duration:   true,

+ 15 - 12
zrpc/config.go

@@ -1,6 +1,8 @@
 package zrpc
 
 import (
+	"time"
+
 	"github.com/zeromicro/go-zero/core/discov"
 	"github.com/zeromicro/go-zero/core/service"
 	"github.com/zeromicro/go-zero/core/stores/redis"
@@ -14,6 +16,19 @@ type (
 	// ServerMiddlewaresConf defines whether to use server middlewares.
 	ServerMiddlewaresConf = internal.ServerMiddlewaresConf
 
+	// A RpcClientConf is a rpc client config.
+	RpcClientConf struct {
+		Etcd          discov.EtcdConf `json:",optional,inherit"`
+		Endpoints     []string        `json:",optional"`
+		Target        string          `json:",optional"`
+		App           string          `json:",optional"`
+		Token         string          `json:",optional"`
+		NonBlock      bool            `json:",optional"`
+		Timeout       int64           `json:",default=2000"`
+		KeepaliveTime time.Duration   `json:",default=20s"`
+		Middlewares   ClientMiddlewaresConf
+	}
+
 	// A RpcServerConf is a rpc server config.
 	RpcServerConf struct {
 		service.ServiceConf
@@ -29,18 +44,6 @@ type (
 		Health      bool `json:",default=true"`
 		Middlewares ServerMiddlewaresConf
 	}
-
-	// A RpcClientConf is a rpc client config.
-	RpcClientConf struct {
-		Etcd        discov.EtcdConf `json:",optional,inherit"`
-		Endpoints   []string        `json:",optional"`
-		Target      string          `json:",optional"`
-		App         string          `json:",optional"`
-		Token       string          `json:",optional"`
-		NonBlock    bool            `json:",optional"`
-		Timeout     int64           `json:",default=2000"`
-		Middlewares ClientMiddlewaresConf
-	}
 )
 
 // NewDirectClientConf returns a RpcClientConf.