-
Notifications
You must be signed in to change notification settings - Fork 8
/
main.go
124 lines (114 loc) · 3.38 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
package system
import (
"context"
"fmt"
"net/http"
"strconv"
"time"
_ "time/tzdata"
"github.com/gin-contrib/cors"
"github.com/gin-contrib/gzip"
"github.com/gin-contrib/pprof"
"github.com/gin-gonic/gin"
"github.com/kardianos/service"
"github.com/taosdata/taosadapter/v3/config"
"github.com/taosdata/taosadapter/v3/controller"
"github.com/taosdata/taosadapter/v3/db"
"github.com/taosdata/taosadapter/v3/log"
"github.com/taosdata/taosadapter/v3/monitor"
"github.com/taosdata/taosadapter/v3/plugin"
"github.com/taosdata/taosadapter/v3/version"
)
var logger = log.GetLogger("main")
func Init() *gin.Engine {
config.Init()
log.ConfigLog()
db.PrepareConnection()
logger.Info("start server:", log.ServerID)
router := createRouter(config.Conf.Debug, &config.Conf.Cors, true)
controllers := controller.GetControllers()
for _, webController := range controllers {
webController.Init(router)
}
plugin.RegisterGenerateAuth(router)
plugin.Init(router)
plugin.Start()
return router
}
func createRouter(debug bool, corsConf *config.CorsConfig, enableGzip bool) *gin.Engine {
if debug {
gin.SetMode(gin.DebugMode)
} else {
gin.SetMode(gin.ReleaseMode)
}
router := gin.New()
router.Use(log.GinLog())
router.Use(log.GinRecoverLog())
if debug {
//docs.SwaggerInfo.Schemes = []string{"http", "https"}
//router.GET("/swagger/*any", swagger.WrapHandler(files.Handler))
pprof.Register(router)
}
if enableGzip {
router.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithDecompressFn(gzip.DefaultDecompressHandle)))
}
router.Use(cors.New(corsConf.GetConfig()))
return router
}
func Start(router *gin.Engine, startHttpServer func(server *http.Server)) {
prg := newProgram(router, startHttpServer)
svcConfig := &service.Config{
Name: fmt.Sprintf("%sadapter", version.CUS_PROMPT),
DisplayName: fmt.Sprintf("%sadapter", version.CUS_PROMPT),
Description: fmt.Sprintf("%sAdapter is a %s’s companion tool and is a bridge/adapter between %s cluster and application.", version.CUS_PROMPT, version.CUS_NAME, version.CUS_NAME),
}
s, err := service.New(prg, svcConfig)
if err != nil {
logger.Fatal(err)
}
err = s.Run()
if err != nil {
logger.Fatal(err)
}
}
type program struct {
router *gin.Engine
server *http.Server
startHttpServer func(server *http.Server)
}
func newProgram(router *gin.Engine, startHttpServer func(server *http.Server)) *program {
server := &http.Server{
Addr: ":" + strconv.Itoa(config.Conf.Port),
Handler: router,
}
return &program{router: router, server: server, startHttpServer: startHttpServer}
}
func (p *program) Start(s service.Service) error {
if service.Interactive() {
logger.Info("Running in terminal.")
} else {
logger.Info("Running under service manager.")
}
monitor.StartMonitor()
logger.Println("server on :", config.Conf.Port)
go p.startHttpServer(p.server)
return nil
}
func (p *program) Stop(s service.Service) error {
logger.Println("Shutdown WebServer ...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
go func() {
if err := p.server.Shutdown(ctx); err != nil {
logger.Println("WebServer Shutdown error:", err)
}
}()
logger.Println("Stop Plugins ...")
plugin.StopWithCtx(ctx)
logger.Println("Server exiting")
ctxLog, cancelLog := context.WithTimeout(context.Background(), 5*time.Second)
defer cancelLog()
logger.Println("Flushing Log")
log.Close(ctxLog)
return nil
}