manager.go 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package router
  2. import (
  3. "bp.jydev.jianyu360.cn/BaseService/gateway/common/db"
  4. . "bp.jydev.jianyu360.cn/BaseService/gateway/common/gatecode"
  5. "fmt"
  6. "github.com/gogf/gf/v2/net/ghttp"
  7. "github.com/gogf/gf/v2/util/gconv"
  8. "log"
  9. "regexp"
  10. )
  11. type Manager struct {
  12. eqRouters map[string]*Router
  13. regexRouter map[*regexp.Regexp]*Router
  14. }
  15. // InitRouterManager 初始化系统代理路由
  16. func InitRouterManager() (*Manager, error) {
  17. res := db.GateWatMySql.Query("SELECT status,middleground_code,url,function_code,check_sess,check_power,check_auth,check_status,check_blacklist,timeout,remark,deduct_source FROM front_proxy")
  18. if res == nil || len(*res) == 0 {
  19. return nil, fmt.Errorf("未发现可用路由")
  20. }
  21. routerManager := &Manager{
  22. eqRouters: make(map[string]*Router),
  23. regexRouter: make(map[*regexp.Regexp]*Router),
  24. }
  25. for _, row := range *res {
  26. router := gconv.String(row["url"])
  27. routerRule := &Router{
  28. Status: gconv.Int(row["status"]),
  29. SessCheck: gconv.Int(row["check_sess"]),
  30. PowerCheck: gconv.Int(row["check_power"]),
  31. AccountCheck: gconv.Int(row["check_status"]),
  32. AuthCheck: gconv.Int(row["check_auth"]),
  33. BlackCheck: gconv.Int(row["check_blacklist"]) == 1,
  34. Deduct: gconv.Int(row["deduct_source"]),
  35. FuncCode: gconv.String(row["function_code"]),
  36. MiddleCode: gconv.String(row["middleground_code"]),
  37. ReqUrl: router,
  38. TimeOut: gconv.Int64(row["timeout"]),
  39. Remark: gconv.String(row["remark"]),
  40. }
  41. if regexp.QuoteMeta(router) == router {
  42. routerManager.eqRouters[router] = routerRule
  43. } else {
  44. reg, err := regexp.Compile(router)
  45. if err != nil {
  46. log.Printf("路由%s装载异常 %v\n", router, err)
  47. }
  48. routerManager.regexRouter[reg] = routerRule
  49. }
  50. }
  51. return routerManager, nil
  52. }
  53. // GetRouterRule 获取路由规则
  54. func (m *Manager) GetRouterRule(url string) (*Router, error) {
  55. routerRule, exists := m.eqRouters[url]
  56. if !exists {
  57. for reg, thisRouterRule := range m.regexRouter {
  58. if reg.MatchString(url) {
  59. routerRule = thisRouterRule
  60. }
  61. }
  62. }
  63. if routerRule == nil {
  64. return nil, NewErrorWithCode(GATEWAY_ROUTER_NOTFIND, fmt.Sprintf("未找到请求地址%s,请检查是否注册到数据库\n", url))
  65. }
  66. if routerRule.Status != 1 {
  67. return nil, NewErrorWithCode(GATEWAY_ROUTER_UPHOLD, fmt.Sprintf("接口状态:%d\n", routerRule.Status))
  68. }
  69. return routerRule, nil
  70. }
  71. // InfusionContext 注入通用结构体gContext
  72. func (m *Manager) InfusionContext(r *ghttp.Request) (err error) {
  73. var router *Router
  74. var GCtx = &GContext{}
  75. router, err = m.GetRouterRule(r.RequestURI)
  76. if err != nil {
  77. r.SetCtxVar(GContextKey, GCtx)
  78. return
  79. }
  80. GCtx.RouterRule = router
  81. //获取session
  82. jySess, _ := InitJySessionContext(r)
  83. GCtx.Sess = jySess
  84. r.SetCtxVar(GContextKey, GCtx)
  85. return
  86. }