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 }