package main import ( "os" "os/signal" "syscall" "laic-backend/cache" "laic-backend/common" "laic-backend/logger" "laic-backend/mqtt" "laic-backend/route" "laic-backend/service" "laic-backend/token" ) func main() { // 1. 初始化日志(先用默认配置,便于后续报错输出) logger.InitCustomLog(logger.Level_D, nil, "laic-backend") // 2. 加载 config.yaml configPath := os.Getenv("LAIC_CONFIG_FILE") if configPath == "" { configPath = "config.yaml" } conf := &common.AppConfig{} common.LoadConfig(configPath, conf) if err := service.InitLiveProvider(conf.Live); err != nil { logger.ERROR("直播提供商初始化失败", err) panic(err) } setLogLevel(conf.Log.Level) token.Init(conf.JWT.Secret, conf.JWT.AccessExpireH, conf.JWT.RefreshExpireH) // 3. 初始化基础设施 common.InitConnection(&conf.Mysql) common.InitTDengine(&conf.TDengine) common.InitRedis(conf.Redis) // 4. 预热缓存 + 启动遥测批量写入 cache.WarmUp() service.DefaultTelemetryStore.Start() // 5. 启动 MQTT(订阅设备上行消息)与 HTTP mqtt.InitMQTT(&conf.MQTT) service.InitMQTTSubscriber() service.DefaultCommandService.StartRetryScanner() service.DefaultScheduler.Start() route.InitRouter(int32(conf.ApiPort)) logger.INFO("laic-backend starting on port:", conf.ApiPort) common.ServerRun(int32(conf.ApiPort)) // 5. 优雅退出 quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit } func setLogLevel(level string) { switch level { case "info": logger.SetLevel(logger.Level_I) case "warn": logger.SetLevel(logger.Level_W) case "error": logger.SetLevel(logger.Level_E) default: logger.SetLevel(logger.Level_D) } }