package routes import ( "skeleton/config" "skeleton/middlewares" "skeleton/routes/rest" "skeleton/routes/ws" "github.com/gin-gonic/gin" "github.com/prometheus/client_golang/prometheus/promhttp" "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin" "go.uber.org/zap" ) // SetupRoutes 设置主路由 func SetupRoutes(cfg *config.Config) *gin.Engine { // 根据配置设置 Gin 模式 if !cfg.App.Debug { gin.SetMode(gin.ReleaseMode) } // 创建 Gin 路由器(不使用默认中间件) r := gin.New() // 设置 multipart form 内存限制为 100MB r.MaxMultipartMemory = 100 << 20 // 100 MB // 添加自定义中间件 r.Use(middlewares.RequestID()) if cfg.Observability.TracingEnabled { r.Use(otelgin.Middleware(cfg.Observability.TracingService)) } if cfg.Observability.MetricsEnabled { r.Use(middlewares.Metrics()) } r.Use(middlewares.CORS()) // CORS跨域处理(需要在其他中间件之前) r.Use(middlewares.GinLogger()) // 结构化日志 r.Use(middlewares.GinRecovery()) // 异常恢复 r.Use(middlewares.ErrorLogging()) // 错误响应日志(用于记录逻辑异常) if cfg.Observability.MetricsEnabled { r.GET(cfg.Observability.MetricsPath, gin.WrapH(promhttp.Handler())) } // API 路由组 api := r.Group("/api") // 公开路由组(无需认证) public := api.Group("") rest.ApplyPublic(public) // 私有路由组(需要 JWT 认证) private := api.Group("/private") private.Use(middlewares.JWTAuth()) // 启用JWT认证中间件 rest.ApplyPrivate(private) // WebSocket 路由组(无需认证) ws.ApplyWebSocketRoutes(api) // 打印路由统计信息 rest.PrintStats() zap.L().Info("主路由设置完成", zap.Any("rest_stats", rest.GetRegistrarStats()), ) return r }