package main import ( "context" "feedsystem_video_go/internal/config" "feedsystem_video_go/internal/db" apphttp "feedsystem_video_go/internal/http" rabbitmq "feedsystem_video_go/internal/middleware/rabbitmq" rediscache "feedsystem_video_go/internal/middleware/redis" "feedsystem_video_go/internal/observability" "log" "strconv" "time" ) func main() { // 加载配置 log.Printf("Loading config from configs/config.yaml") const configPath = "configs/config.yaml" cfg, usedDefault, err := config.LoadLocalDev(configPath) if err != nil { log.Fatalf("Failed to load config: %v", err) } if usedDefault { log.Printf("Config File %s not found, using default local config", configPath) } else { log.Printf("Config loaded from file: %s", configPath) } // 连接数据库 //log.Printf("Database config: %v", cfg.Database) sqlDB, err := db.NewDB(cfg.Database) if err != nil { log.Fatalf("Failed to connect database: %v", err) } if err := db.AutoMigrate(sqlDB); err != nil { log.Fatalf("Failed to auto migrate database: %v", err) } defer db.CloseDB(sqlDB) // 连接 Redis (可选,用于缓存) cache, err := rediscache.NewFromEnv(&cfg.Redis) if err != nil { log.Printf("Redis config error (cache disabled): %v", err) cache = nil } else { pingCtx, cancel := context.WithTimeout(context.Background(), 300*time.Millisecond) defer cancel() if err := cache.Ping(pingCtx); err != nil { log.Printf("Redis not available (cache disabled): %v", err) _ = cache.Close() cache = nil } else { defer cache.Close() log.Printf("Redis connected (cache enabled)") } } // 连接 RabbitMQ (可选,用于消息队列) rmq, err := rabbitmq.NewRabbitMQ(&cfg.RabbitMQ) if err != nil { log.Printf("RabbitMQ config error (disabled): %v", err) rmq = nil } else { defer rmq.Close() log.Printf("RabbitMQ connected") } // Pprof pprofServer, err := observability.StartPprofServer( "API", cfg.ObservabilityConfig.Pprof.Enabled, cfg.ObservabilityConfig.Pprof.ApiAddr, ) if err != nil { log.Printf("Failed to start API pprof server: %v", err) } defer func() { shutdownCtx, cancel := context.WithTimeout(context.Background(), 3 * time.Second) defer cancel() if err := observability.Shutdown(shutdownCtx, pprofServer); err != nil { log.Printf("Failed to shutdown API pprof server: %v", err) } }() // 设置路由 r := apphttp.SetRouter(sqlDB, cache, rmq) log.Printf("Server is running on port %d", cfg.Server.Port) if err := r.Run(":" + strconv.Itoa(cfg.Server.Port)); err != nil { log.Fatalf("Failed to run server: %v", err) } }