feat: set default connection idle time for grpc servers (#1922)

* feat: set default connection idle time for grpc servers

* feat: add grpc health check
master
Kevin Wan 3 years ago committed by GitHub
parent 6b1e15cab1
commit ca88b69d24
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -7,6 +7,7 @@ import (
"github.com/zeromicro/go-zero/core/stat" "github.com/zeromicro/go-zero/core/stat"
"github.com/zeromicro/go-zero/zrpc/internal/serverinterceptors" "github.com/zeromicro/go-zero/zrpc/internal/serverinterceptors"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/health/grpc_health_v1"
) )
type ( type (
@ -71,9 +72,15 @@ func (s *rpcServer) Start(register RegisterFn) error {
WithStreamServerInterceptors(streamInterceptors...)) WithStreamServerInterceptors(streamInterceptors...))
server := grpc.NewServer(options...) server := grpc.NewServer(options...)
register(server) register(server)
// register the health check service
grpc_health_v1.RegisterHealthServer(server, s.health)
s.health.Resume()
// we need to make sure all others are wrapped up, // we need to make sure all others are wrapped up,
// so we do graceful stop at shutdown phase instead of wrap up phase // so we do graceful stop at shutdown phase instead of wrap up phase
waitForCalled := proc.AddWrapUpListener(func() { waitForCalled := proc.AddWrapUpListener(func() {
s.health.Shutdown()
server.GracefulStop() server.GracefulStop()
}) })
defer waitForCalled() defer waitForCalled()

@ -1,10 +1,16 @@
package internal package internal
import ( import (
"time"
"github.com/zeromicro/go-zero/core/stat" "github.com/zeromicro/go-zero/core/stat"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/health"
"google.golang.org/grpc/keepalive"
) )
const defaultConnectionIdleDuration = time.Minute * 5
type ( type (
// RegisterFn defines the method to register a server. // RegisterFn defines the method to register a server.
RegisterFn func(*grpc.Server) RegisterFn func(*grpc.Server)
@ -20,6 +26,7 @@ type (
baseRpcServer struct { baseRpcServer struct {
address string address string
health *health.Server
metrics *stat.Metrics metrics *stat.Metrics
options []grpc.ServerOption options []grpc.ServerOption
streamInterceptors []grpc.StreamServerInterceptor streamInterceptors []grpc.StreamServerInterceptor
@ -30,7 +37,11 @@ type (
func newBaseRpcServer(address string, rpcServerOpts *rpcServerOptions) *baseRpcServer { func newBaseRpcServer(address string, rpcServerOpts *rpcServerOptions) *baseRpcServer {
return &baseRpcServer{ return &baseRpcServer{
address: address, address: address,
health: health.NewServer(),
metrics: rpcServerOpts.metrics, metrics: rpcServerOpts.metrics,
options: []grpc.ServerOption{grpc.KeepaliveParams(keepalive.ServerParameters{
MaxConnectionIdle: defaultConnectionIdleDuration,
})},
} }
} }

Loading…
Cancel
Save