main.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package main
  2. import (
  3. "context"
  4. "github.com/gin-gonic/gin"
  5. "go.uber.org/zap"
  6. "go_zh/middleware"
  7. "go_zh/pkg/logger"
  8. "go_zh/router"
  9. "net/http"
  10. "os"
  11. "os/signal"
  12. "syscall"
  13. "time"
  14. )
  15. func main() {
  16. // 1. 初始化日志系统
  17. if err := logger.InitLogger(); err != nil {
  18. panic("初始化日志失败: " + err.Error())
  19. }
  20. // 确保程序退出前刷新日志缓冲区
  21. defer logger.Sync()
  22. // 初始化Gin引擎
  23. //gin.SetMode(gin.ReleaseMode)
  24. engine := gin.Default()
  25. engine.Use(middleware.GinLoggerMiddleware()) //日志中间件
  26. engine.Use(middleware.GinRecoveryMiddleware()) //recover中间件
  27. // 设置路由
  28. router.SetupRoutes(engine)
  29. // 启动服务
  30. //_ = engine.Run(":8080")
  31. srv := &http.Server{
  32. Addr: ":8080",
  33. Handler: engine.Handler(),
  34. }
  35. // 10. 优雅启动和关闭
  36. startServer(srv)
  37. }
  38. // startServer 启动服务器
  39. func startServer(srv *http.Server) {
  40. // 在goroutine中启动服务器
  41. go func() {
  42. zap.L().Info("启动HTTP服务器",
  43. zap.String("address", srv.Addr),
  44. )
  45. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  46. zap.L().Fatal("启动服务器失败", zap.Error(err))
  47. }
  48. }()
  49. // 等待中断信号
  50. quit := make(chan os.Signal, 1)
  51. signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
  52. <-quit
  53. zap.L().Info("收到关闭信号,开始优雅关闭...")
  54. // 创建关闭超时上下文
  55. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  56. defer cancel()
  57. // 关闭服务器
  58. if err := srv.Shutdown(ctx); err != nil {
  59. zap.L().Error("服务器关闭失败", zap.Error(err))
  60. }
  61. zap.L().Info("服务器已关闭")
  62. }