package main import ( "context" "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" "api/config" "api/router" "github.com/gin-gonic/gin" "github.com/joho/godotenv" ) func main() { // 加载环境变量 if err := godotenv.Load(); err != nil { log.Println("No .env file found, using environment variables") } // 设置运行模式 if os.Getenv("APP_ENV") == "production" { gin.SetMode(gin.ReleaseMode) } else { gin.SetMode(gin.DebugMode) } // 初始化配置 cfg := config.New() // 初始化数据库连接 if err := cfg.InitDB(); err != nil { log.Fatalf("Failed to initialize database: %v", err) } defer cfg.CloseDB() // 初始化 Redis 连接 if err := cfg.InitRedis(); err != nil { log.Fatalf("Failed to initialize redis: %v", err) } defer cfg.CloseRedis() // 创建 Gin 引擎 r := gin.New() // 使用中间件 r.Use(gin.Logger()) r.Use(gin.Recovery()) // 注册路由 router.RegisterRoutes(r, cfg) // 获取端口 port := os.Getenv("APP_PORT") if port == "" { port = "8080" } // 创建 HTTP 服务器 srv := &http.Server{ Addr: fmt.Sprintf(":%s", port), Handler: r, } // 优雅启停 go func() { log.Printf("Server starting on port %s", port) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("Failed to start server: %v", err) } }() // 等待中断信号 quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutting down server...") // 设置关闭超时 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { log.Fatalf("Server forced to shutdown: %v", err) } log.Println("Server exited") }