-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
140 lines (125 loc) · 3.26 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
package main
import (
"context"
_ "database/sql"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"sync"
"syscall"
"time"
"github.com/bramble555/blog/dao/es"
dao_mysql "github.com/bramble555/blog/dao/mysql"
"github.com/bramble555/blog/dao/redis"
"github.com/bramble555/blog/flag"
"github.com/bramble555/blog/global"
"github.com/bramble555/blog/logger"
"github.com/bramble555/blog/model"
"github.com/bramble555/blog/router"
"github.com/bramble555/blog/setting"
_ "github.com/go-sql-driver/mysql"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/mysql"
_ "github.com/golang-migrate/migrate/v4/source/file"
)
func main() {
var err error
// 初始化 config
if err = setting.Init(); err != nil {
fmt.Printf("Init settings failed, err:%v\n", err)
return
}
// 初始化 logger
if global.Log, err = logger.Init(); err != nil {
fmt.Printf("Init logger failed, err:%v\n", err)
return
}
// 初始化 db
if global.DB, err = dao_mysql.Init(); err != nil {
global.Log.Errorf("Init mysql failed, err:%v\n", err)
return
}
// 迁移数据库
db, _ := global.DB.DB()
migrationDriver, err := mysql.WithInstance(db, &mysql.Config{}) // 使用 migrate 的 mysql 驱动
if err != nil {
global.Log.Errorf("migration Driver failed, err:%v\n", err)
return
}
migrator, err := migrate.NewWithDatabaseInstance(
"file://migration", // 迁移脚本路径
global.Config.Mysql.DB, // 数据库名
migrationDriver, // 迁移驱动
)
if err != nil {
global.Log.Errorf("migration failed, err:%v\n", err)
return
}
err = migrator.Up()
if err != nil {
global.Log.Errorf("migration up failed, err:%v\n", err)
return
}
// 初始化 redis
global.Redis, err = redis.Init()
if err != nil {
global.Log.Printf("Init redis failed, err:%v\n", err)
return
}
// 初始化 ES
if global.Config.ES.Enable {
global.ES, err = es.Init()
if err != nil {
global.Log.Errorf("es init err:%s\n", err.Error())
return
}
// 创建文章索引
a := model.ArticleModel{}
err = a.CreateIndex()
if err != nil {
global.Log.Errorf("es index init err:%s\n", err.Error())
return
}
// a.DeleteIndex()
}
// 解析命令行参数
op := flag.FlagUserParse()
// 如果没有传递用户名参数,启动服务器
if op.Username == "" || op.Password == "" {
startServer()
return
}
// 如果有用户名参数,则尝试创建用户
flag.CreateUser(&op)
}
// 启动 Gin 服务器
func startServer() {
wg := sync.WaitGroup{}
r := router.InitRouter(global.Config.System.Env, &wg)
srv := &http.Server{
Addr: fmt.Sprintf(":%d", global.Config.System.Port),
Handler: r,
}
go func() {
if err := srv.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
global.Log.Info("Shutdown Server ...")
// 等待所有后台任务完成
wg.Wait()
// 创建一个5秒超时的context
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// 优雅关闭服务
if err := srv.Shutdown(ctx); err != nil {
global.Log.Fatal("Server Shutdown: ", err.Error())
}
global.Log.Info("Server exiting")
}