package main import ( "context" "log" "net/http" "os" "os/signal" "syscall" "time" "clash-speed-test/internal/api" "clash-speed-test/internal/config" "clash-speed-test/internal/core" "clash-speed-test/internal/database" applogger "clash-speed-test/internal/logger" ) func main() { // 初始化日志 applogger.Init() // 加载配置 cfg, err := config.Load() if err != nil { log.Fatalf("加载配置失败: %v", err) } // 初始化数据库 db, err := database.Init(cfg.Database) if err != nil { log.Fatalf("初始化数据库失败: %v", err) } // 初始化测速器 speedTester := core.NewSpeedTester(cfg) // 初始化调度器 scheduler := core.NewScheduler(speedTester, cfg) // 初始化API服务器 server := api.NewServer(cfg, db, speedTester, scheduler) // 启动调度器 go scheduler.Start() // 启动HTTP服务器 go func() { applogger.Info("启动HTTP服务器", map[string]interface{}{ "port": cfg.Server.Port, }) if err := server.Start(); err != nil && err != http.ErrServerClosed { applogger.Error("HTTP服务器启动失败", map[string]interface{}{ "error": err.Error(), }) } }() // 等待中断信号 quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit applogger.Info("收到关闭信号,开始优雅关闭") // 创建超时上下文 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // 停止调度器 scheduler.Stop() // 关闭HTTP服务器 if err := server.Shutdown(ctx); err != nil { applogger.Error("HTTP服务器关闭失败", map[string]interface{}{ "error": err.Error(), }) } applogger.Info("应用已关闭") }