engine.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package engine
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. "go_server/base/config"
  6. "go_server/base/core"
  7. "go_server/base/engine/middleware"
  8. "go_server/global"
  9. "go_server/router"
  10. "go_server/scheduler"
  11. "os"
  12. )
  13. func Run() {
  14. address := fmt.Sprintf(":%d", config.AppConf().Addr)
  15. engine := engineInit()
  16. logRoutes()
  17. // 启动红包定时任务调度器
  18. bizDbs, _, _ := core.BizDbs()
  19. if appDb, ok := bizDbs["app"]; ok {
  20. redPacketScheduler := scheduler.GetScheduler(appDb)
  21. if err := redPacketScheduler.Start(); err != nil {
  22. core.Log.Errorf("启动红包调度器失败: %v", err)
  23. }
  24. } else {
  25. core.Log.Warn("未找到 app 数据库配置,跳过红包调度器启动")
  26. }
  27. core.Log.Infof("Gin开启http监听: %s", address)
  28. core.Log.Infof("Gin run error: %+v", engine.Run(address))
  29. }
  30. // gin
  31. func engineInit() *gin.Engine {
  32. gin.SetMode(gin.ReleaseMode)
  33. engine := gin.New()
  34. // 挂在全局中间件
  35. engine.Use(middleware.Recovery()) // 全局错误恢复中间件
  36. engine.Use(middleware.Cors()) // 跨域 -- 放行所有
  37. k8sGroup(engine) // k8s 健康检查
  38. // 挂在静态文件 用于文件服务 代理路径"/static" 存储路径"uploads"
  39. // 代理转发
  40. routerPrefix := "admin"
  41. if config.AppConf().RouterPrefix != "" {
  42. routerPrefix = config.AppConf().RouterPrefix
  43. }
  44. engine.Static(config.EnvConf().File.ProxyPath, config.EnvConf().File.StorePath)
  45. if _, err := os.Stat(config.EnvConf().File.StorePath); os.IsNotExist(err) {
  46. err := os.Mkdir(config.EnvConf().File.StorePath, 0755) // 设置文件权限为rwxr-xr-x(默认值)
  47. if err != nil {
  48. panic(err)
  49. }
  50. }
  51. proxyPrefix := fmt.Sprintf("%s/api/proxy", routerPrefix)
  52. proxyGroup := engine.Group(proxyPrefix)
  53. proxyGroup.Use(middleware.GinLogger()) // 日志处理 -- 自定义日志
  54. proxyGroup.Use(middleware.JwtMiddleware()) // jwt鉴权
  55. // todo: 接口权限限制中间件
  56. proxyGroup.Any("/*path", createReverseProxy())
  57. // 使用代理中间件
  58. publicGroup := engine.Group(routerPrefix)
  59. publicGroup.Use(middleware.GinLogger()) // 日志处理 -- 自定义日志
  60. privateGroup := engine.Group(routerPrefix)
  61. privateGroup.Use(middleware.GinLogger()) // 日志处理 -- 自定义日志
  62. privateGroup.Use(middleware.JwtMiddleware()).Use(middleware.Auth()) // 挂载中间件 -- token auth
  63. if config.AppConf().Mod != config.ModEnvDev {
  64. // 仅本地调试时使用
  65. }
  66. global.RegisterRouter(publicGroup, router.PubRouterGroupApp{})
  67. global.RegisterRouter(privateGroup, router.PriRouterGroupApp{})
  68. global.GVA_ROUTERS = engine.Routes()
  69. return engine
  70. }
  71. // 通用k8s健康检查
  72. func k8sGroup(engine *gin.Engine) {
  73. health := engine.Group("/health")
  74. {
  75. health.GET("/liveness", func(ctx *gin.Context) {
  76. ctx.JSON(200, gin.H{"status": "alive"})
  77. })
  78. health.GET("/readiness", func(ctx *gin.Context) {
  79. ctx.JSON(200, gin.H{"status": "ready"})
  80. })
  81. }
  82. }
  83. func logRoutes() {
  84. for _, route := range global.GVA_ROUTERS {
  85. core.Log.Infof("ROUTE | %s | URI:%s ",
  86. route.Method, route.Path)
  87. }
  88. }