package boots import ( "context" "fmt" "go-nc/configs/global" "go-nc/internal/utils" "log" "net/http" "os" "os/signal" "syscall" "time" "go-nc/internal/middleware" "github.com/gin-gonic/gin" routes "go-nc/internal/router" ) // 初始化路由 func setupRouter() *gin.Engine { // 初始化 Gin 引擎,并设置调试模式为 false gin.SetMode(gin.ReleaseMode) // 创建一个 Gin 路由实例 router := gin.Default() // 加载中间件: recover router.Use(middleware.Recover) // 加载中间件:使用统一响应中间件 router.Use(middleware.UnifiedResponseMiddleware()) // 设置静态文件路径 router.Static("static", "./public") // 注册 api 分组路由 apiGroup := router.Group("/", middleware.JwtAuth()) // 设置 api 分组路由 routes.SetApiGroupRoutes(apiGroup) return router } // 运行服务 func RunServer() { // 初始化路由 r := setupRouter() // 创建一个 HTTP 服务器实例 srv := &http.Server{ Addr: ":" + global.App.Config.App.Port, Handler: r, } go func() { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen: %s\n", err) } }() // 等待中断信号以优雅地关闭服务器, 设置 1 个缓冲区 quit := make(chan os.Signal, 1) // 通知 quit 通道接收信号 signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) fmt.Print("\n\x1b[32m http://" + utils.GetLocalIP() + ":" + global.App.Config.App.Port + "\x1b[0m \n") // 等待信号 <-quit log.Println("服务器正在退出...") // 设置 5 秒的超时时间 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() // 优雅地关闭服务器 if err := srv.Shutdown(ctx); err != nil { log.Fatal("服务器退出失败:", err) } log.Println("服务器退出成功~") }