go-micro.dev/v5@v5.12.0/server/grpc/options.go (about)

     1  package grpc
     2  
     3  import (
     4  	"context"
     5  	"crypto/tls"
     6  	"net"
     7  
     8  	"go-micro.dev/v5/broker"
     9  	"go-micro.dev/v5/codec"
    10  	"go-micro.dev/v5/logger"
    11  	"go-micro.dev/v5/registry"
    12  	"go-micro.dev/v5/server"
    13  	"go-micro.dev/v5/transport"
    14  	"google.golang.org/grpc"
    15  	"google.golang.org/grpc/encoding"
    16  )
    17  
    18  type codecsKey struct{}
    19  type grpcOptions struct{}
    20  type netListener struct{}
    21  type maxMsgSizeKey struct{}
    22  type maxConnKey struct{}
    23  type tlsAuth struct{}
    24  type grpcServerKey struct{}
    25  
    26  // gRPC Codec to be used to encode/decode requests for a given content type.
    27  func Codec(contentType string, c encoding.Codec) server.Option {
    28  	return func(o *server.Options) {
    29  		codecs := make(map[string]encoding.Codec)
    30  		if o.Context == nil {
    31  			o.Context = context.Background()
    32  		}
    33  		if v, ok := o.Context.Value(codecsKey{}).(map[string]encoding.Codec); ok && v != nil {
    34  			codecs = v
    35  		}
    36  		codecs[contentType] = c
    37  		o.Context = context.WithValue(o.Context, codecsKey{}, codecs)
    38  	}
    39  }
    40  
    41  // AuthTLS should be used to setup a secure authentication using TLS.
    42  func AuthTLS(t *tls.Config) server.Option {
    43  	return setServerOption(tlsAuth{}, t)
    44  }
    45  
    46  // MaxConn specifies maximum number of max simultaneous connections to server.
    47  func MaxConn(n int) server.Option {
    48  	return setServerOption(maxConnKey{}, n)
    49  }
    50  
    51  // Listener specifies the net.Listener to use instead of the default.
    52  func Listener(l net.Listener) server.Option {
    53  	return setServerOption(netListener{}, l)
    54  }
    55  
    56  // Server specifies a *grpc.Server to use instead of the default
    57  // This is for rare use case where user need to expose grpc.Server for
    58  // customization. Please NOTE however user injected grpcServer doesn't support
    59  // server Handler abstraction.
    60  func Server(srv *grpc.Server) server.Option {
    61  	return setServerOption(grpcServerKey{}, srv)
    62  }
    63  
    64  // Options to be used to configure gRPC options.
    65  func Options(opts ...grpc.ServerOption) server.Option {
    66  	return setServerOption(grpcOptions{}, opts)
    67  }
    68  
    69  // MaxMsgSize set the maximum message in bytes the server can receive and
    70  // send.  Default maximum message size is 4 MB.
    71  func MaxMsgSize(s int) server.Option {
    72  	return setServerOption(maxMsgSizeKey{}, s)
    73  }
    74  
    75  func newOptions(opt ...server.Option) server.Options {
    76  	opts := server.Options{
    77  		Codecs:        make(map[string]codec.NewCodec),
    78  		Metadata:      map[string]string{},
    79  		Broker:        broker.DefaultBroker,
    80  		Registry:      registry.DefaultRegistry,
    81  		RegisterCheck: server.DefaultRegisterCheck,
    82  		Transport:     transport.DefaultTransport,
    83  		Address:       server.DefaultAddress,
    84  		Name:          server.DefaultName,
    85  		Id:            server.DefaultId,
    86  		Version:       server.DefaultVersion,
    87  		Logger:        logger.DefaultLogger,
    88  	}
    89  
    90  	for _, o := range opt {
    91  		o(&opts)
    92  	}
    93  
    94  	return opts
    95  }