main.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "github.com/spf13/viper"
  7. "go.uber.org/zap"
  8. "go_zh/config"
  9. "go_zh/middleware"
  10. "go_zh/pkg/logger"
  11. "go_zh/router"
  12. "net/http"
  13. "os"
  14. "os/signal"
  15. "syscall"
  16. "time"
  17. )
  18. func main() {
  19. // 设置配置文件路径和名称
  20. viper.SetConfigFile("config.json")
  21. viper.SetConfigType("json") // 明确指定JSON格式
  22. err := viper.ReadInConfig() // 搜索并读取配置文件
  23. if err != nil { // 处理错误
  24. panic("初始化配置失败: " + err.Error())
  25. }
  26. // 初始化日志系统
  27. if err := logger.InitLogger(); err != nil {
  28. panic("初始化日志失败: " + err.Error())
  29. }
  30. // 确保程序退出前刷新日志缓冲区
  31. defer logger.Sync()
  32. //初始化mysql
  33. config.InitMysql()
  34. //初始化redis
  35. config.InitRedis()
  36. // 设置 Gin 模式
  37. gin.SetMode(viper.GetString("app.mode"))
  38. // 初始化Gin引擎
  39. engine := gin.Default()
  40. engine.Use(middleware.GinLoggerMiddleware()) //日志中间件
  41. engine.Use(middleware.GinRecoveryMiddleware()) //recover中间件
  42. // 设置路由
  43. router.SetupRoutes(engine)
  44. // 启动服务
  45. //_ = engine.Run(":8080")
  46. srv := &http.Server{
  47. Addr: fmt.Sprintf(":%d", viper.GetInt("app.port")),
  48. Handler: engine.Handler(),
  49. }
  50. // 优雅启动和关闭
  51. startServer(srv)
  52. }
  53. // startServer 启动服务器
  54. func startServer(srv *http.Server) {
  55. // 在goroutine中启动服务器
  56. go func() {
  57. zap.L().Info("启动HTTP服务器",
  58. zap.String("address", srv.Addr),
  59. )
  60. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  61. zap.L().Fatal("启动服务器失败", zap.Error(err))
  62. }
  63. }()
  64. // 等待中断信号
  65. quit := make(chan os.Signal, 1)
  66. signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
  67. <-quit
  68. zap.L().Info("收到关闭信号,开始优雅关闭...")
  69. // 创建关闭超时上下文
  70. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  71. defer cancel()
  72. // 关闭服务器
  73. if err := srv.Shutdown(ctx); err != nil {
  74. zap.L().Error("服务器关闭失败", zap.Error(err))
  75. }
  76. zap.L().Info("服务器已关闭")
  77. }