package main import ( "context" "log" "net/http" "os" "os/signal" "syscall" "time" "ca-mini/db" "ca-mini/internal/config" "ca-mini/internal/logger" "ca-mini/internal/routes" "github.com/gorilla/mux" ) func main() { // 加载配置 cfg, err := config.Load() if err != nil { log.Printf("Failed to load config %v", err) } // 初始化日志记录器 logger.InitLogger() defer logger.CloseLogger() // 初始化数据库连接 if err := db.InitDB(); err != nil { log.Printf("Failed to initialize database: %v", err) } defer db.CloseDB() // 设置Gin路由 r := mux.NewRouter() routes.SetupAPIRoutes(r) // 启动HTTP服务器 server := &http.Server{ Addr: cfg.ServerAddress, Handler: r, ReadTimeout: 10 * time.Second, } // 启动服务器 go func() { log.Printf("Server starting on %v", cfg.ServerAddress) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Printf("Failed to start server: %v", err) } }() // 优雅关闭服务器 stop := make(chan os.Signal, 1) signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM) <-stop log.Println("Server shutting down") // 设置超时时间 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { log.Printf("Server shutdown failed: %v", err) } log.Println("Server exited properly") }