router.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package boots
  2. import (
  3. "context"
  4. "fmt"
  5. "go-nc/configs/global"
  6. "go-nc/internal/utils"
  7. "log"
  8. "net/http"
  9. "os"
  10. "os/signal"
  11. "syscall"
  12. "time"
  13. "go-nc/internal/middleware"
  14. "github.com/gin-gonic/gin"
  15. routes "go-nc/internal/router"
  16. )
  17. // 初始化路由
  18. func setupRouter() *gin.Engine {
  19. // 初始化 Gin 引擎,并设置调试模式为 false
  20. gin.SetMode(gin.ReleaseMode)
  21. // 创建一个 Gin 路由实例
  22. router := gin.Default()
  23. // 加载中间件: recover
  24. router.Use(middleware.Recover)
  25. // 加载中间件:使用统一响应中间件
  26. router.Use(middleware.UnifiedResponseMiddleware())
  27. // 设置静态文件路径
  28. router.Static("static", "./public")
  29. // 注册 api 分组路由
  30. apiGroup := router.Group("/", middleware.JwtAuth())
  31. // 设置 api 分组路由
  32. routes.SetApiGroupRoutes(apiGroup)
  33. return router
  34. }
  35. // 运行服务
  36. func RunServer() {
  37. // 初始化路由
  38. r := setupRouter()
  39. // 创建一个 HTTP 服务器实例
  40. srv := &http.Server{
  41. Addr: ":" + global.App.Config.App.Port,
  42. Handler: r,
  43. }
  44. go func() {
  45. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  46. log.Fatalf("listen: %s\n", err)
  47. }
  48. }()
  49. // 等待中断信号以优雅地关闭服务器, 设置 1 个缓冲区
  50. quit := make(chan os.Signal, 1)
  51. // 通知 quit 通道接收信号
  52. signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
  53. fmt.Print("\n\x1b[32m http://" + utils.GetLocalIP() + ":" + global.App.Config.App.Port + "\x1b[0m \n")
  54. // 等待信号
  55. <-quit
  56. log.Println("服务器正在退出...")
  57. // 设置 5 秒的超时时间
  58. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  59. defer cancel()
  60. // 优雅地关闭服务器
  61. if err := srv.Shutdown(ctx); err != nil {
  62. log.Fatal("服务器退出失败:", err)
  63. }
  64. log.Println("服务器退出成功~")
  65. }