forked from hyperledger/fabric-chaincode-go
/
server.go
106 lines (86 loc) · 2.59 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Copyright the Hyperledger Fabric contributors. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package internal
import (
"crypto/tls"
"errors"
"net"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/keepalive"
)
const (
serverInterval = time.Duration(2) * time.Hour // 2 hours - gRPC default
serverTimeout = time.Duration(20) * time.Second // 20 sec - gRPC default
serverMinInterval = time.Duration(1) * time.Minute
connectionTimeout = 5 * time.Second
)
// Server abstracts grpc service properties
type Server struct {
Listener net.Listener
Server *grpc.Server
}
// Start the server
func (s *Server) Start() error {
if s.Listener == nil {
return errors.New("nil listener")
}
if s.Server == nil {
return errors.New("nil server")
}
return s.Server.Serve(s.Listener)
}
// Stop the server
func (s *Server) Stop() {
if s.Server != nil {
s.Server.Stop()
}
}
// NewServer creates a new implementation of a GRPC Server given a
// listen address
func NewServer(
address string,
tlsConf *tls.Config,
srvKaOpts *keepalive.ServerParameters,
) (*Server, error) {
if address == "" {
return nil, errors.New("server listen address not provided")
}
//create our listener
listener, err := net.Listen("tcp", address)
if err != nil {
return nil, err
}
//set up server options for keepalive and TLS
var serverOpts []grpc.ServerOption
if srvKaOpts != nil {
serverOpts = append(serverOpts, grpc.KeepaliveParams(*srvKaOpts))
} else {
serverKeepAliveParameters := keepalive.ServerParameters{
Time: 1 * time.Minute,
Timeout: 20 * time.Second,
}
serverOpts = append(serverOpts, grpc.KeepaliveParams(serverKeepAliveParameters))
}
if tlsConf != nil {
serverOpts = append(serverOpts, grpc.Creds(credentials.NewTLS(tlsConf)))
}
// Default properties follow - let's start simple and stick with defaults for now.
// These match Fabric peer side properties. We can expose these as user properties
// if needed
// set max send and recv msg sizes
serverOpts = append(serverOpts, grpc.MaxSendMsgSize(maxSendMessageSize))
serverOpts = append(serverOpts, grpc.MaxRecvMsgSize(maxRecvMessageSize))
//set enforcement policy
kep := keepalive.EnforcementPolicy{
MinTime: serverMinInterval,
// allow keepalive w/o rpc
PermitWithoutStream: true,
}
serverOpts = append(serverOpts, grpc.KeepaliveEnforcementPolicy(kep))
//set default connection timeout
serverOpts = append(serverOpts, grpc.ConnectionTimeout(connectionTimeout))
server := grpc.NewServer(serverOpts...)
return &Server{Listener: listener, Server: server}, nil
}