manager.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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,ischeck,ischeck_auth,ischeck_blacklist,timeout,remark,deduct_source,ischeck_status 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. PowerCheck: gconv.Int(row["ischeck"]),
  30. AccountCheck: gconv.Int(row["ischeck_status"]),
  31. AuthCheck: gconv.Int(row["ischeck_auth"]),
  32. BlackCheck: gconv.Int(row["ischeck_blacklist"]) == 1,
  33. Deduct: gconv.Int(row["deduct_source"]),
  34. FuncCode: gconv.String(row["function_code"]),
  35. MiddleCode: gconv.String(row["middleground_code"]),
  36. ReqUrl: router,
  37. TimeOut: gconv.Int64(row["timeout"]),
  38. Remark: gconv.String(row["remark"]),
  39. }
  40. if regexp.QuoteMeta(router) == router {
  41. routerManager.eqRouters[router] = routerRule
  42. } else {
  43. reg, err := regexp.Compile(router)
  44. if err != nil {
  45. log.Printf("路由%s装载异常 %v\n", router, err)
  46. }
  47. routerManager.regexRouter[reg] = routerRule
  48. }
  49. }
  50. return routerManager, nil
  51. }
  52. // GetRouterRule 获取路由规则
  53. func (m *Manager) GetRouterRule(url string) (*Router, error) {
  54. routerRule, exists := m.eqRouters[url]
  55. if !exists {
  56. for reg, thisRouterRule := range m.regexRouter {
  57. if reg.MatchString(url) {
  58. routerRule = thisRouterRule
  59. }
  60. }
  61. }
  62. if routerRule == nil {
  63. return nil, NewErrorWithCode(GATEWAY_ROUTER_NOTFIND, fmt.Sprintf("未找到请求地址%s,请检查是否注册到数据库\n", url))
  64. }
  65. if routerRule.Status != 1 {
  66. return nil, NewErrorWithCode(GATEWAY_ROUTER_UPHOLD, fmt.Sprintf("接口状态:%d\n", routerRule.Status))
  67. }
  68. return routerRule, nil
  69. }
  70. // InfusionContext 注入通用结构体gContext
  71. func (m *Manager) InfusionContext(r *ghttp.Request) (err error) {
  72. var router *Router
  73. var GCtx = &GContext{}
  74. router, err = m.GetRouterRule(r.RequestURI)
  75. if err != nil {
  76. r.SetCtxVar(GContextKey, GCtx)
  77. return
  78. }
  79. GCtx.RouterRule = router
  80. //获取session
  81. jySess, _ := InitJySessionContext(r)
  82. GCtx.Sess = jySess
  83. r.SetCtxVar(GContextKey, GCtx)
  84. return
  85. }