manager.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package router
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/net/ghttp"
  5. "github.com/gogf/gf/v2/net/gtrace"
  6. "github.com/gogf/gf/v2/util/gconv"
  7. "jygit.jydev.jianyu360.cn/dataservice/tripartite_gateway/common/db"
  8. . "jygit.jydev.jianyu360.cn/dataservice/tripartite_gateway/common/gatecode"
  9. "log"
  10. "regexp"
  11. )
  12. type Manager struct {
  13. eqRouters map[string]*Router
  14. regexRouter map[*regexp.Regexp]*Router
  15. }
  16. // InitRouterManager 初始化系统代理路由
  17. // 支持完全匹配和正则匹配
  18. func InitRouterManager() (*Manager, error) {
  19. //加载规则
  20. res := db.GateWatMySql.Query(fmt.Sprintf("SELECT * FROM %s", "front_proxy"))
  21. if res == nil || len(*res) == 0 {
  22. return nil, fmt.Errorf("未发现可用路由")
  23. }
  24. // 初始化 routerManager
  25. routerManager := &Manager{
  26. eqRouters: make(map[string]*Router),
  27. regexRouter: make(map[*regexp.Regexp]*Router),
  28. }
  29. for _, row := range *res {
  30. // 获取路由信息
  31. router := gconv.String(row["url"])
  32. routerRule := &Router{
  33. Status: gconv.Int(row["status"]),
  34. ReqUrl: router,
  35. TimeOut: gconv.Int64(row["timeout"]),
  36. Remark: gconv.String(row["remark"]),
  37. Server: gconv.String(row["server"]),
  38. }
  39. // 判断路由匹配方式是完全匹配还是正则匹配 (此处逻辑参考x-web框架)
  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. // 根据用户请求地址匹配路由规则,优先绝对匹配后用正则匹配。
  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. break
  61. }
  62. }
  63. }
  64. if routerRule == nil {
  65. return nil, NewErrorWithCode(GATEWAY_ROUTER_NOTFIND, fmt.Sprintf("未找到请求地址%s,请检查是否注册到数据库\n", url))
  66. }
  67. // 路由状态判断
  68. if routerRule.Status != 1 {
  69. return nil, NewErrorWithCode(GATEWAY_ROUTER_UPHOLD, fmt.Sprintf("接口状态:%d\n", routerRule.Status))
  70. }
  71. return routerRule, nil
  72. }
  73. // InfusionContext 注入通用结构体gContext
  74. func (m *Manager) InfusionContext(r *ghttp.Request) (err error) {
  75. _, span := gtrace.NewSpan(r.Context(), "InfusionContext")
  76. defer span.End()
  77. //r.SetCtx(ctx)
  78. var router *Router
  79. var GCtx = &GContext{
  80. RouterRule: &Router{},
  81. }
  82. router, err = m.GetRouterRule(r.URL.Path)
  83. if err != nil {
  84. r.SetCtxVar(GContextKey, GCtx)
  85. return
  86. }
  87. GCtx.RouterRule = router
  88. //获取session
  89. /*jySess, _ := InitJySessionContext(r)
  90. GCtx.Sess = jySess*/
  91. r.SetCtxVar(GContextKey, GCtx)
  92. return
  93. }