-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.go
153 lines (133 loc) · 3.86 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
146
147
148
149
150
151
152
153
package httpserver
/**
* created by mengqi on 2023/11/21
*/
import (
"context"
"errors"
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
ut "github.com/go-playground/universal-translator"
"github.com/penglongli/gin-metrics/ginmetrics"
"github.com/chaos-ma/chaos/log"
mws "github.com/chaos-ma/chaos/server/httpserver/middlewares"
"github.com/chaos-ma/chaos/server/httpserver/pprof"
"github.com/chaos-ma/chaos/server/httpserver/validation"
)
type JwtInfo struct {
// defaults to "JWT"
Realm string
// defaults to empty
Key string
// defaults to 7 days
Timeout time.Duration
// defaults to 7 days
MaxRefresh time.Duration
}
// Server wrapper for gin.Engine
type Server struct {
*gin.Engine
port int //端口号, 默认值 8080
mode string //开发模式, 默认值 debug
healthz bool //是否开启健康检查接口, 默认开启, 如果开启会自动添加 /health 接口
enableProfiling bool //是否开启pprof接口, 默认开启, 如果开启会自动添加 /debug/pprof 接口
enableMetrics bool //是否开启metrics接口, 默认开启, 如果开启会自动添加 /metrics 接口
middlewares []string //中间件
jwt *JwtInfo //jwt配置信息
transName string //翻译器, 默认值 zh
trans ut.Translator
server *http.Server
serviceName string
}
func NewServer(opts ...ServerOption) *Server {
srv := &Server{
port: 8080,
mode: "debug",
healthz: true,
enableProfiling: true,
jwt: &JwtInfo{
"JWT",
"GUeLB4rcX7LEus2rkeWuBPrZwNdR7pkV",
7 * 24 * time.Hour,
7 * 24 * time.Hour,
},
Engine: gin.Default(),
transName: "zh",
serviceName: "chaos",
}
for _, o := range opts {
o(srv)
}
srv.Use(mws.TracingHandler(srv.serviceName))
for _, m := range srv.middlewares {
mw, ok := mws.Middlewares[m]
if !ok {
log.Warnf("can not find middleware: %s", m)
continue
//panic(errors.Errorf("can not find middleware: %s", m))
}
log.Infof("intall middleware: %s", m)
srv.Use(mw)
}
return srv
}
func (s *Server) Translator() ut.Translator {
return s.trans
}
// start rest server
func (s *Server) Start(ctx context.Context) error {
//设置开发模式,打印路由信息
if s.mode != gin.DebugMode && s.mode != gin.ReleaseMode && s.mode != gin.TestMode {
return errors.New("mode must be one of debug/release/test")
}
//设置开发模式,打印路由信息
gin.SetMode(s.mode)
gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) {
log.Infof("%-6s %-s --> %s(%d handlers)", httpMethod, absolutePath, handlerName, nuHandlers)
}
//TODO 初始化翻译器
err := s.initTrans(s.transName)
if err != nil {
log.Errorf("initTrans error %s", err.Error())
return err
}
//注册mobile验证码
validation.RegisterMobile(s.trans)
//根据配置初始化pprof路由
if s.enableProfiling {
pprof.Register(s.Engine)
}
if s.enableMetrics {
// get global Monitor object
m := ginmetrics.GetMonitor()
// +optional set metric path, default /debug/metrics
m.SetMetricPath("/metrics")
// +optional set slow time, default 5s
// +optional set request duration, default {0.1, 0.3, 1.2, 5, 10}
// used to p95, p99
m.SetDuration([]float64{0.1, 0.3, 1.2, 5, 10})
m.Use(s)
}
log.Infof("rest server is running on port: %d", s.port)
address := fmt.Sprintf(":%d", s.port)
s.server = &http.Server{
Addr: address,
Handler: s.Engine,
}
_ = s.SetTrustedProxies(nil)
if err = s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
return err
}
return nil
}
func (s *Server) Stop(ctx context.Context) error {
log.Infof("rest server is stopping")
if err := s.server.Shutdown(ctx); err != nil {
log.Errorf("rest server shutdown error: %s", err.Error())
return err
}
log.Info("rest server stopped")
return nil
}