New creates a new Server.
(options ...Option)
| 60 | |
| 61 | // New creates a new Server. |
| 62 | func New(options ...Option) (*Server, error) { |
| 63 | opts := defaultOptions // start with defaults |
| 64 | options = append(options, DefaultOptions...) |
| 65 | for _, opt := range options { |
| 66 | if err := opt(&opts); err != nil { |
| 67 | return nil, fmt.Errorf("failed to apply option: %w", err) |
| 68 | } |
| 69 | } |
| 70 | if opts.clientTLSConfig == nil && !opts.insecureClient { |
| 71 | return nil, ErrNoClientTLSConfig |
| 72 | } |
| 73 | if opts.serverTLSConfig == nil && !opts.insecureServer { |
| 74 | return nil, ErrNoServerTLSConfig |
| 75 | } |
| 76 | |
| 77 | var peerClientBuilder peerTypes.ClientBuilder = &peerTypes.LocalClientBuilder{} |
| 78 | if !strings.HasPrefix(opts.peerTarget, "unix://") { |
| 79 | peerClientBuilder = &peerTypes.RemoteClientBuilder{ |
| 80 | TLSConfig: opts.clientTLSConfig, |
| 81 | TLSServerName: peer.TLSServerName(defaults.PeerServiceName, opts.clusterName), |
| 82 | } |
| 83 | } |
| 84 | |
| 85 | pm, err := pool.NewPeerManager( |
| 86 | registry, |
| 87 | pool.WithPeerServiceAddress(opts.peerTarget), |
| 88 | pool.WithPeerClientBuilder(peerClientBuilder), |
| 89 | pool.WithClientConnBuilder(pool.GRPCClientConnBuilder{ |
| 90 | TLSConfig: opts.clientTLSConfig, |
| 91 | }), |
| 92 | pool.WithRetryTimeout(opts.retryTimeout), |
| 93 | pool.WithLogger(opts.log), |
| 94 | ) |
| 95 | if err != nil { |
| 96 | return nil, err |
| 97 | } |
| 98 | |
| 99 | var serverOpts []grpc.ServerOption |
| 100 | |
| 101 | if len(opts.grpcUnaryInterceptors) > 0 { |
| 102 | serverOpts = append(serverOpts, grpc.ChainUnaryInterceptor(opts.grpcUnaryInterceptors...)) |
| 103 | } |
| 104 | if len(opts.grpcStreamInterceptors) > 0 { |
| 105 | serverOpts = append(serverOpts, grpc.ChainStreamInterceptor(opts.grpcStreamInterceptors...)) |
| 106 | } |
| 107 | |
| 108 | if opts.serverTLSConfig != nil { |
| 109 | tlsConfig := opts.serverTLSConfig.ServerConfig(&tls.Config{ |
| 110 | MinVersion: MinTLSVersion, |
| 111 | }) |
| 112 | serverOpts = append(serverOpts, grpc.Creds(credentials.NewTLS(tlsConfig))) |
| 113 | } |
| 114 | grpcServer := grpc.NewServer(serverOpts...) |
| 115 | grpcHealthServer := grpc.NewServer() |
| 116 | |
| 117 | observerOptions := copyObserverOptionsWithLogger(opts.log, opts.observerOptions) |
| 118 | observerSrv, err := observer.NewServer(pm, observerOptions...) |
| 119 | if err != nil { |
no test coverage detected