engine.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. "os"
  11. )
  12. func Run() {
  13. address := fmt.Sprintf(":%d", config.AppConf().Addr)
  14. engine := engineInit()
  15. logRoutes()
  16. core.Log.Infof("Gin开启http监听: %s", address)
  17. core.Log.Infof("Gin run error: %+v", engine.Run(address))
  18. }
  19. // gin
  20. func engineInit() *gin.Engine {
  21. gin.SetMode(gin.ReleaseMode)
  22. engine := gin.New()
  23. // 挂在全局中间件
  24. engine.Use(middleware.Recovery()) // 全局错误恢复中间件
  25. engine.Use(middleware.Cors()) // 跨域 -- 放行所有
  26. k8sGroup(engine) // k8s 健康检查
  27. // 挂在静态文件 用于文件服务 代理路径"/static" 存储路径"uploads"
  28. // 代理转发
  29. routerPrefix := "admin"
  30. if config.AppConf().RouterPrefix != "" {
  31. routerPrefix = config.AppConf().RouterPrefix
  32. }
  33. engine.Static(config.EnvConf().File.ProxyPath, config.EnvConf().File.StorePath)
  34. if _, err := os.Stat(config.EnvConf().File.StorePath); os.IsNotExist(err) {
  35. err := os.Mkdir(config.EnvConf().File.StorePath, 0755) // 设置文件权限为rwxr-xr-x(默认值)
  36. if err != nil {
  37. panic(err)
  38. }
  39. }
  40. proxyPrefix := fmt.Sprintf("%s/api/proxy", routerPrefix)
  41. proxyGroup := engine.Group(proxyPrefix)
  42. proxyGroup.Use(middleware.GinLogger()) // 日志处理 -- 自定义日志
  43. proxyGroup.Use(middleware.JwtMiddleware()) // jwt鉴权
  44. // todo: 接口权限限制中间件
  45. proxyGroup.Any("/*path", createReverseProxy())
  46. // 使用代理中间件
  47. publicGroup := engine.Group(routerPrefix)
  48. publicGroup.Use(middleware.GinLogger()) // 日志处理 -- 自定义日志
  49. privateGroup := engine.Group(routerPrefix)
  50. privateGroup.Use(middleware.GinLogger()) // 日志处理 -- 自定义日志
  51. privateGroup.Use(middleware.JwtMiddleware()).Use(middleware.Auth()) // 挂载中间件 -- token auth
  52. if config.AppConf().Mod != config.ModEnvDev {
  53. // 仅本地调试时使用
  54. }
  55. global.RegisterRouter(publicGroup, router.PubRouterGroupApp{})
  56. global.RegisterRouter(privateGroup, router.PriRouterGroupApp{})
  57. global.GVA_ROUTERS = engine.Routes()
  58. return engine
  59. }
  60. // 通用k8s健康检查
  61. func k8sGroup(engine *gin.Engine) {
  62. health := engine.Group("/health")
  63. {
  64. health.GET("/liveness", func(ctx *gin.Context) {
  65. ctx.JSON(200, gin.H{"status": "alive"})
  66. })
  67. health.GET("/readiness", func(ctx *gin.Context) {
  68. ctx.JSON(200, gin.H{"status": "ready"})
  69. })
  70. }
  71. }
  72. func logRoutes() {
  73. for _, route := range global.GVA_ROUTERS {
  74. core.Log.Infof("ROUTE | %s | URI:%s ",
  75. route.Method, route.Path)
  76. }
  77. }