| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package main
- import (
- "context"
- "github.com/gin-gonic/gin"
- "go.uber.org/zap"
- "go_zh/middleware"
- "go_zh/pkg/logger"
- "go_zh/router"
- "net/http"
- "os"
- "os/signal"
- "syscall"
- "time"
- )
- func main() {
- // 1. 初始化日志系统
- if err := logger.InitLogger(); err != nil {
- panic("初始化日志失败: " + err.Error())
- }
- // 确保程序退出前刷新日志缓冲区
- defer logger.Sync()
- // 初始化Gin引擎
- //gin.SetMode(gin.ReleaseMode)
- engine := gin.Default()
- engine.Use(middleware.GinLoggerMiddleware()) //日志中间件
- engine.Use(middleware.GinRecoveryMiddleware()) //recover中间件
- // 设置路由
- router.SetupRoutes(engine)
- // 启动服务
- //_ = engine.Run(":8080")
- srv := &http.Server{
- Addr: ":8080",
- Handler: engine.Handler(),
- }
- // 10. 优雅启动和关闭
- startServer(srv)
- }
- // startServer 启动服务器
- func startServer(srv *http.Server) {
- // 在goroutine中启动服务器
- go func() {
- zap.L().Info("启动HTTP服务器",
- zap.String("address", srv.Addr),
- )
- if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
- zap.L().Fatal("启动服务器失败", zap.Error(err))
- }
- }()
- // 等待中断信号
- quit := make(chan os.Signal, 1)
- signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
- <-quit
- zap.L().Info("收到关闭信号,开始优雅关闭...")
- // 创建关闭超时上下文
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- // 关闭服务器
- if err := srv.Shutdown(ctx); err != nil {
- zap.L().Error("服务器关闭失败", zap.Error(err))
- }
- zap.L().Info("服务器已关闭")
- }
|