125 lines
3.4 KiB
Go
125 lines
3.4 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"dashboard/controller/unisc"
|
||
"dashboard/dao/sqldb"
|
||
"dashboard/logger"
|
||
"dashboard/pkg/errgroups"
|
||
"dashboard/routes"
|
||
"dashboard/services/uniss"
|
||
"dashboard/settings"
|
||
"flag"
|
||
"fmt"
|
||
|
||
"github.com/fsnotify/fsnotify"
|
||
)
|
||
|
||
var config = flag.String("f", "./config/config.yaml", "config file path")
|
||
|
||
func callBack(e fsnotify.Event) {
|
||
// os.Exit(0)
|
||
// fmt.Println(e, os.Args)
|
||
|
||
// out, err := exec.Command("go", "run", os.Args[0]).Output()
|
||
|
||
// fmt.Println(out, err)
|
||
}
|
||
|
||
func main() {
|
||
flag.Parse()
|
||
|
||
sets := settings.New(settings.WithName(*config), settings.WithCallBack(callBack))
|
||
|
||
log, err := logger.New(
|
||
logger.WithFileName(sets.LogConfig.Filename),
|
||
logger.WithLevel(sets.LogConfig.Level),
|
||
logger.WithMaxAge(sets.LogConfig.MaxAge),
|
||
logger.WithMaxSize(sets.LogConfig.MaxSize),
|
||
logger.WithMaxBackUp(sets.LogConfig.MaxBackUps),
|
||
logger.WithMode(sets.BaseConfig.Mode),
|
||
)
|
||
if err != nil {
|
||
fmt.Println(err)
|
||
panic(err)
|
||
}
|
||
defer func() {
|
||
_ = log.Sync()
|
||
}()
|
||
|
||
log.Info("Settings and log init ok:)")
|
||
|
||
db, err := sqldb.NewDb(sets.SqlConfig)
|
||
if err != nil {
|
||
log.Sugar().Panicf("New db error: %v", err)
|
||
}
|
||
defer func() {
|
||
_ = db.GetDb().Close()
|
||
}()
|
||
|
||
err = sqldb.SqlDbInit(log, db)
|
||
if err != nil {
|
||
log.Sugar().Panicf("New db error: %v", err)
|
||
}
|
||
|
||
// r := routes.Setup(log, *sets.RateLimitConfig, *sets.JwtConfig)
|
||
|
||
// listenAndServe(fmt.Sprintf(":%d", sets.BaseConfig.Port), r, log)
|
||
var sunisa []errgroups.FuncWithErr
|
||
var route []unisc.UnisHttpChanneler
|
||
for index := range sets.UnisConfig.Instances {
|
||
sets.UnisConfig.Instances = index
|
||
unis, err := uniss.NewUnis(log, sets.UnisConfig)
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
sunisa = append(sunisa, unis)
|
||
route = append(route, unis)
|
||
}
|
||
|
||
errwg := errgroups.NewErrGroup()
|
||
|
||
errwg.Add(routes.NewRouter(fmt.Sprintf(":%d", sets.BaseConfig.Port),
|
||
log, *sets.RateLimitConfig, *sets.JwtConfig,
|
||
unisc.NewHttpRoute(route...)))
|
||
errwg.Add(sunisa...)
|
||
|
||
log.Sugar().Fatalln(errwg.Run(context.Background()))
|
||
}
|
||
|
||
/*
|
||
func listenAndServe(addr string, handle http.Handler, log *logger.Logger) {
|
||
srv := &http.Server{
|
||
Addr: addr,
|
||
Handler: handle,
|
||
}
|
||
|
||
log.Sugar().Infof("Server listen on %s", addr)
|
||
go func() {
|
||
// 开启一个goroutine启动服务
|
||
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||
log.Error("listen: %s\n", zap.Error(err))
|
||
}
|
||
}()
|
||
|
||
// 等待中断信号来优雅地关闭服务器,为关闭服务器操作设置一个5秒的超时
|
||
quit := make(chan os.Signal, 1) // 创建一个接收信号的通道
|
||
// kill 默认会发送 syscall.SIGTERM 信号
|
||
// kill -2 发送 syscall.SIGINT 信号,我们常用的Ctrl+C就是触发系统SIGINT信号
|
||
// kill -9 发送 syscall.SIGKILL 信号,但是不能被捕获,所以不需要添加它
|
||
// signal.Notify把收到的 syscall.SIGINT或syscall.SIGTERM 信号转发给quit
|
||
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // 此处不会阻塞
|
||
<-quit // 阻塞在此,当接收到上述两种信号时才会往下执行
|
||
log.Info("Shutdown Server ...")
|
||
// 创建一个5秒超时的context
|
||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||
defer cancel()
|
||
// 5秒内优雅关闭服务(将未处理完的请求处理完再关闭服务),超过5秒就超时退出
|
||
if err := srv.Shutdown(ctx); err != nil {
|
||
log.Error("Server Shutdown: ", zap.Error(err))
|
||
}
|
||
|
||
log.Info("Server exiting")
|
||
}
|
||
*/
|