SpringCloud 中 Gateway 是如何关联对应的 GatewayFilterFactory 和 参数解析的
问题
在看项目的时候遇到了一些疑问
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 并返回对应的过滤器呢?
版权声明: 本文为 InfoQ 作者【gin】的原创文章。
原文链接:【http://xie.infoq.cn/article/0ce5b7b528237a90b094216f4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论