package main import ( "91porn-server/common/cachev2" "91porn-server/common/laosiji" "context" "fmt" "net/http" "os" "os/signal" "syscall" "time" "91porn-server/common" "91porn-server/common/conf" "91porn-server/common/constant" "91porn-server/common/db" "91porn-server/common/httputil" "91porn-server/common/laosiji_app" "91porn-server/common/log" "91porn-server/common/sms" "91porn-server/common/tg" "91porn-server/models" "91porn-server/models/Init" _ "91porn-server/models/commod" // swagger依赖 _ "91porn-server/models/v/ldycfgmod" // swagger依赖 _ "91porn-server/models/v/moduleconfmod" // swagger依赖 _ "91porn-server/models/v/modulesectionmod" // swagger依赖 _ "91porn-server/models/v/operationlogmod" // swagger依赖 _ "91porn-server/models/v/rchgamegoldmod" // swagger依赖 _ "91porn-server/models/v/rchgamtmod" // swagger依赖 _ "91porn-server/models/v/rchgchanmod" // swagger依赖 _ "91porn-server/models/v/tagconfmod" // swagger依赖 _ "91porn-server/models/v/wdchannmod" // swagger依赖 // _ "91porn-server/web/docs" "91porn-server/web/router" "91porn-server/web/service/activityser" officialwebsiteser "91porn-server/web/service/officialWebsiteser" "91porn-server/web/service/prefetch" "91porn-server/web/webg" ) var httpServer *http.Server func main() { time.Local, _ = time.LoadLocation("Asia/Shanghai") common.Go(startUp) waitQuit() } func init() { cfg := webg.GlobalConfig{} //加载配置 etcd配置 static := webg.StaticSource{} if err := conf.LoadJSON("config/static.json", &static); err != nil { fmt.Printf("startUp load static error: %v\n", err) } if err := conf.LoadJSON("config/web.json", &cfg); err != nil { fmt.Printf("startUp get config error: %v\n", err) os.Exit(1) } fmt.Println("use local config successfully") webg.Conf = &cfg webg.Static = &static sms.Init(sms.Config{ FengNiao: sms.FengNiaoConfig{ Url: cfg.SMS.FengNiao.Url, ChinaMercId: cfg.SMS.FengNiao.ChinaMercId, ChinaSecret: cfg.SMS.FengNiao.ChinaSecret, ChinaTmplId: cfg.SMS.FengNiao.ChinaTmplId, InterMercId: cfg.SMS.FengNiao.InterMercId, InterSecret: cfg.SMS.FengNiao.InterSecret, InterTmplId: cfg.SMS.FengNiao.InterTmplId, }, }) laosiji_app.Init(webg.Conf.LaoSiJiAiMate) log.Init(log.Options{Level: webg.Conf.Log.Level, DisableStack: webg.Conf.Log.DisableStacktrace}) if cfg.Base.Env == constant.ProdEnv { webg.Bot = tg.New(tg.TianTian_Bot, fmt.Sprintf("短视频[env:%s]", webg.Conf.Base.Env)) common.SetPanicHandler(func(s string) { _ = webg.Bot.Send(tg.Msg{ChatId: tg.ChatIdServerTeam, Text: "[Web-Server]" + s}) }) } } func startUp() { ds := db.InitDS(InitMongodbParam(models.RegisterPool)) if len(ds) > 0 { for k, v := range ds { switch k { case models.VideoDb: webg.VideoDB = v case models.LogDb: webg.LogDB = v case models.StatDb: webg.StatDB = v } } } // 初始化Redis webg.InitRedis() // 初始化缓存操作中间件 cachev2.Init(webg.Redis, log.ZapLog) // 初始化ES webg.InitElastic() webg.ProxyCfg = &httputil.ProxyCfg{ Host: webg.Conf.URL.HttpProxy, IsActive: false, } Init.InitMongo() laosiji.Init(*webg.Conf) //载入活动定时任务 if err := activityser.LoadingJob(); err != nil { os.Exit(1) return } // 官网 seoSlug 回填定时任务:扫描各表缺失 seoSlug 的记录按标题补齐 officialwebsiteser.StartSeoSlugBackfillCron() port := webg.Conf.Base.Port httpServer = &http.Server{ Addr: fmt.Sprintf(":%d", port), Handler: router.SetupGin(), } log.Info("Web Start Listen ...", log.Any("port", port)) if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatal("server listen err", log.E(err)) } //Block Here log.Info("httpServer quit...") } func waitQuit() { //graceful exit ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT) <-ch log.Info("Recv Signal, Shutdown Server Start...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if httpServer != nil { if err := httpServer.Shutdown(ctx); err != nil { log.Error(fmt.Sprintf("Server Shutdown:%+v", err)) } } db.CloseDS() prefetch.StopSubmitPrefetch() if err := webg.RedisClose(); err != nil { log.Error("redis close error", log.E(err)) return } log.Warn("Shutdown Server OK...") } func InitMongodbParam(registerPool []models.Register) ([]db.DBmap, []db.Register) { pri := db.DBmap{ Key: models.VideoDb, URL: webg.Conf.Mongo.VideoDbUrl, } sta := db.DBmap{ Key: models.StatDb, URL: webg.Conf.Mongo.StatDbUrl, } log := db.DBmap{ Key: models.LogDb, URL: webg.Conf.Mongo.LogDbUrl, } dbgister := make([]db.Register, len(registerPool)) for i, v := range registerPool { dbgister[i] = db.Register{Key: v.Key, Table: v.Table} } dbmaps := []db.DBmap{pri, sta, log} return dbmaps, dbgister }