写点什么

SpringCloud 中 Gateway 是如何关联对应的 GatewayFilterFactory 和 参数解析的

作者:gin
  • 2022 年 5 月 13 日
  • 本文字数:797 字

    阅读完需:约 3 分钟

问题

在看项目的时候遇到了一些疑问

  • StripPrefix 为什么是对应什么呢?

  • 2 这个参数是如何传递的?

假想

因为是配置在 filters 中,很容易想到 StripPrefix 就是一个过滤器,但是查全文都不存在该类名,只发现了 StripPrefixGatewayFilterFactory ,感觉与之关联。

发现对应的实现就是配置文件中需要的功能(移除部分路径),config.getParts() 的值就是对应着 2,这个功能是如何实现的呢?

看源码

从点击配置文件中 filters 进入 GatewayProperties ,发现配置中 routes 被解析成 RouteDefinition。


查看 RouteDefinition 中,发现有一个 filters 的属性。

进入 FilterDefinition 中,发现了有两个属性,name 和 args(map 类型),从构造方法可知道 name 对应的是 StripPrefix ,而 args 存储的是(_genkey_0=2)

NameUtils.generateName(i) 方法会 加 '_genkey_' 前缀

现在已经了解了参数的解析,那 StripPrefix 怎么关联的呢?

回到 GatewayProperties 方法,如果需要用到 StripPrefix 字段,就必须用到 GatewayProperties#getRoutes 方法,发现只有 PropertiesRouteDefinitionLocator#getRouteDefinitions 中调用

继续查看引用 getRouteDefinitions 方法的地方,进入 RouteDefinitionRouteLocator#getRoutes


发现 Route 类有个属性 gatewayFilters,他已经将 StripPrefix 解析成对应的过滤器了,说明里面有对应的转换逻辑

进入 this::convertToRoute 方法

进入 getFilters

进入 loadGatewayFilters,其中 StripPrefix 就是 definition.getName() 的第一个值

gatewayFilterFactories 是一个容器,其中的 key 是 factory.name(),而 value 是对应的 GatewayFilterFactory 类型

factory.name() 的实现逻辑 GatewayFilterFactory#name

查看 NameUtils#normalizeFilterFactoryName

现在终于知道了 Gateway 是可以在配置文件中的 filters 中填写前缀就可以了。

那 2 这个参数是如何传到 StripPrefixGatewayFilterFactory 并返回对应的过滤器呢?


发布于: 刚刚阅读数: 4
用户头像

gin

关注

真正的大师永远怀着一颗学徒的心 2020.01.17 加入

还未添加个人简介

评论

发布
暂无评论
SpringCloud 中 Gateway 是如何关联对应的 GatewayFilterFactory 和 参数解析的_Gateway_gin_InfoQ写作社区