main.go 2.0 KB

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