-
Notifications
You must be signed in to change notification settings - Fork 3
/
server.go
145 lines (120 loc) · 3.39 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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package rpc
import (
"context"
"fmt"
"net"
"github.com/abulo/ratel/logger"
"github.com/abulo/ratel/server"
"google.golang.org/grpc"
)
// Config ...
type Config struct {
Host string
Port int
Network string // Network network type, tcp4 by default
serverOptions []grpc.ServerOption
streamInterceptors []grpc.StreamServerInterceptor
unaryInterceptors []grpc.UnaryServerInterceptor
Name string
}
// Server ...
type Server struct {
*grpc.Server
listener net.Listener
config *Config
serverInfo *server.ServiceInfo
}
// Build ...
func (config *Config) Build() *Server {
newServer := grpc.NewServer(config.serverOptions...)
listener, err := net.Listen(config.Network, config.Address())
if err != nil {
logger.Logger.Info("new grpc server err", config.Address(), err)
}
config.Port = listener.Addr().(*net.TCPAddr).Port
info := server.ApplyOptions(
server.WithScheme("grpc"),
server.WithAddress(config.Address()),
server.WithName(config.Name),
)
return &Server{
Server: newServer,
listener: listener,
config: config,
serverInfo: &info,
}
}
// Serve implements server.Server interface.
func (s *Server) Serve() error {
err := s.Server.Serve(s.listener)
return err
}
// Stop implements server.Server interface
// it will terminate echo server immediately
func (s *Server) Stop() error {
s.Server.Stop()
return nil
}
// GracefulStop implements server.Server interface
// it will stop echo server gracefully
func (s *Server) GracefulStop(ctx context.Context) error {
s.Server.GracefulStop()
return nil
}
func (s *Server) Info() *server.ServiceInfo {
info := server.ApplyOptions(
server.WithScheme("grpc"),
server.WithAddress(s.config.Address()),
server.WithName(s.config.Name),
)
return &info
}
// WithServerOption inject server option to grpc server
// User should not inject interceptor option, which is recommend by WithStreamInterceptor
// and WithUnaryInterceptor
func (config *Config) WithServerOption(options ...grpc.ServerOption) *Config {
if config.serverOptions == nil {
config.serverOptions = make([]grpc.ServerOption, 0)
}
config.serverOptions = append(config.serverOptions, options...)
return config
}
// WithStreamInterceptor inject stream interceptors to server option
func (config *Config) WithStreamInterceptor(intes ...grpc.StreamServerInterceptor) *Config {
if config.streamInterceptors == nil {
config.streamInterceptors = make([]grpc.StreamServerInterceptor, 0)
}
config.streamInterceptors = append(config.streamInterceptors, intes...)
return config
}
// WithUnaryInterceptor inject unary interceptors to server option
func (config *Config) WithUnaryInterceptor(intes ...grpc.UnaryServerInterceptor) *Config {
if config.unaryInterceptors == nil {
config.unaryInterceptors = make([]grpc.UnaryServerInterceptor, 0)
}
config.unaryInterceptors = append(config.unaryInterceptors, intes...)
return config
}
func (config *Config) Address() string {
return fmt.Sprintf("%s:%d", config.Host, config.Port)
}
// WithHost ...
func (config *Config) WithHost(host string) *Config {
config.Host = host
return config
}
// WithPort ...
func (config *Config) WithPort(port int) *Config {
config.Port = port
return config
}
// WithNetwork ...
func (config *Config) WithNetwork(network string) *Config {
config.Network = network
return config
}
// WithName ...
func (config *Config) WithName(name string) *Config {
config.Name = name
return config
}