server/grpc: add MaxConn option to limit max inflight requests (#1247)

Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
Василий Толстов 2020-02-24 16:48:56 +03:00
parent 28ef20ef4a
commit f727b75b6f
2 changed files with 20 additions and 6 deletions

18
grpc.go
View File

@ -24,6 +24,7 @@ import (
"github.com/micro/go-micro/v2/util/addr" "github.com/micro/go-micro/v2/util/addr"
mgrpc "github.com/micro/go-micro/v2/util/grpc" mgrpc "github.com/micro/go-micro/v2/util/grpc"
mnet "github.com/micro/go-micro/v2/util/net" mnet "github.com/micro/go-micro/v2/util/net"
"golang.org/x/net/netutil"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/codes" "google.golang.org/grpc/codes"
@ -163,13 +164,14 @@ func (g *grpcServer) getGrpcOptions() []grpc.ServerOption {
} }
func (g *grpcServer) getListener() net.Listener { func (g *grpcServer) getListener() net.Listener {
if g.opts.Context != nil { if g.opts.Context == nil {
if v := g.opts.Context.Value(netListener{}); v != nil { return nil
if l, ok := v.(net.Listener); ok { }
if l, ok := g.opts.Context.Value(netListener{}).(net.Listener); ok && l != nil {
return l return l
} }
}
}
return nil return nil
} }
@ -799,6 +801,12 @@ func (g *grpcServer) Start() error {
} }
} }
if g.opts.Context != nil {
if c, ok := g.opts.Context.Value(maxConnKey{}).(int); ok && c > 0 {
ts = netutil.LimitListener(ts, c)
}
}
log.Infof("Server [grpc] Listening on %s", ts.Addr().String()) log.Infof("Server [grpc] Listening on %s", ts.Addr().String())
g.Lock() g.Lock()
g.opts.Address = ts.Addr().String() g.opts.Address = ts.Addr().String()

View File

@ -18,6 +18,7 @@ type codecsKey struct{}
type grpcOptions struct{} type grpcOptions struct{}
type netListener struct{} type netListener struct{}
type maxMsgSizeKey struct{} type maxMsgSizeKey struct{}
type maxConnKey struct{}
type tlsAuth struct{} type tlsAuth struct{}
// gRPC Codec to be used to encode/decode requests for a given content type // gRPC Codec to be used to encode/decode requests for a given content type
@ -40,6 +41,11 @@ func AuthTLS(t *tls.Config) server.Option {
return setServerOption(tlsAuth{}, t) return setServerOption(tlsAuth{}, t)
} }
// MaxConn specifies maximum number of max simultaneous connections to server
func MaxConn(n int) server.Option {
return setServerOption(maxConnKey{}, n)
}
// Listener specifies the net.Listener to use instead of the default // Listener specifies the net.Listener to use instead of the default
func Listener(l net.Listener) server.Option { func Listener(l net.Listener) server.Option {
return setServerOption(netListener{}, l) return setServerOption(netListener{}, l)