-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
166 lines (145 loc) · 4.54 KB
/
main.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
154
155
156
157
158
159
160
161
162
163
164
165
166
// NoToDo 后端服务
package main
import (
"context"
"fmt"
"github.com/NoToDoProject/NoToDo/config"
"github.com/NoToDoProject/NoToDo/controller"
serverController "github.com/NoToDoProject/NoToDo/controller/server"
userController "github.com/NoToDoProject/NoToDo/controller/user"
db "github.com/NoToDoProject/NoToDo/database"
"github.com/NoToDoProject/NoToDo/middleware"
"github.com/NoToDoProject/NoToDo/model"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
log "github.com/sirupsen/logrus"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
// init 初始化
func init() {
gin.SetMode(gin.ReleaseMode) // 设置gin运行模式
//gin.DefaultWriter = io.Discard // 设置gin日志输出到空
// 设置日志格式为Text格式
log.SetFormatter(&log.TextFormatter{
TimestampFormat: "2006-01-02 15:04:05", // 时间格式
ForceColors: true, // 强制颜色
//FullTimestamp: true, // 显示完整时间
})
// 设置将日志输出到标准输出(默认的输出为stderr)
// 日志消息输出可以是任意的io.writer类型
log.SetOutput(os.Stdout)
// 设置日志级别为Trace
log.SetLevel(log.TraceLevel)
}
var startTime = time.Now() // 启动时间
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
// main 主函数
func main() {
config.LoadConfig() // 加载配置文件
log.Debug(fmt.Sprintf("config: %v", config.Config))
db.Connect() // 连接数据库
engine := gin.New() // 创建无中间件应用
_ = engine.SetTrustedProxies(nil) // 允许所有代理
engine.NoRoute(controller.NotFoundRoute()) // 设置404路由
// 设置全局中间件
middlewares := []gin.HandlerFunc{
cors.New(cors.Config{
AllowOrigins: []string{"*"},
AllowMethods: []string{"GET", "POST"},
AllowHeaders: []string{"Origin", "Content-Type"},
ExposeHeaders: []string{"Content-Length"},
AllowCredentials: true,
AllowOriginFunc: func(origin string) bool {
return true
},
MaxAge: 12 * time.Hour,
}), // 设置跨域中间件
middleware.LogMiddleware(), // 设置日志中间件
middleware.TimerMiddleware(), // 设置计时中间件
middleware.Recovery(), // 设置恢复中间件
}
engine.Use(middlewares...) // 使用中间件
// 设置路由
routers := []model.Controller{
serverController.Server{}, // 服务器相关
userController.User{}, // 用户相关
}
for _, router := range routers {
router.InitRouter(engine)
}
// websocket 测试
engine.GET("/ws", func(c *gin.Context) {
if !c.IsWebsocket() {
log.Errorf("Not websocket request")
return
}
ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
log.Errorf("Failed to set websocket upgrade: %+v", err)
return
}
logger := log.WithFields(log.Fields{
"remote_addr": c.Request.RemoteAddr,
})
defer func(ws *websocket.Conn) {
err := ws.Close()
if err != nil {
logger.Errorf("Failed to close websocket: %+v", err)
}
}(ws)
logger.Infof("<<- New websocket connection")
for {
messageType, message, err := ws.ReadMessage()
if err != nil {
if websocket.IsCloseError(err, websocket.CloseNormalClosure, websocket.CloseGoingAway) {
logger.Infof("<<- Websocket connection closed")
break
}
logger.Errorf("Failed to read message: %+v", err)
break
}
logger.Infof("<<- WS Recv: %-10s", message)
for i, j := 0, len(message)-1; i < j; i, j = i+1, j-1 {
message[i], message[j] = message[j], message[i]
}
err = ws.WriteMessage(messageType, message)
logger.Infof("->> WS Send: %-10s", message)
if err != nil {
logger.Errorf("Failed to write message: %+v", err)
break
}
}
})
server := &http.Server{
Addr: fmt.Sprintf("%s:%s", config.Config.Server.Host, config.Config.Server.Port),
Handler: engine,
}
go func() {
log.Infof("Server is running at %s:%s", config.Config.Server.Host, config.Config.Server.Port)
log.Debugf("Start using: %s", time.Since(startTime).String())
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Info("Shutdown Server ...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
log.Panic("Server Shutdown:", err)
}
log.Info("Server exiting")
}