SetPath GatewayFilter 工厂
SetPath GatewayFilter 工厂接受一个路径 template 参数。 它通过允许路径的模板化片段,提供了一种操作请求路径的简单方法。 这使用了 Spring Framework 的 URI 模板。 允许多个匹配片段。
以下示例配置了一个 SetPath GatewayFilter:
application.yml
yaml
spring:
cloud:
gateway:
routes:
- id: setpath_route
uri: https://example.org
predicates:
- Path=/red/{segment}
filters:
- SetPath=/{segment}对于路径为 /red/blue 的请求,这会在发起下游请求之前将路径设置为 /blue。
补充教学 —— SetPath 与 RewritePath 的区别?
很多同学容易搞混 SetPath 和 RewritePath,其实它们解决的是同一个问题(修改请求路径),但手段不同。
RewritePath (正则替换派):
- 原理:基于正则表达式。把路径看作一个字符串,匹配你给的正则,然后替换成新的字符串。
- 配置:
RewritePath=/red/(?<segment>.*), /$\{segment} - 优点:正则功能强大,适合复杂的字符串处理。
- 缺点:正则写起来容易头晕,不仅要转义,还要小心匹配范围。
SetPath (模板提取派):
- 原理:基于 URI 模板变量。它通常和
Path断言配合使用。 - 流程:
- 提取:
Path=/red/{segment}先把/red/blue中的blue提取出来,存到变量segment里。 - 设置:
SetPath=/{segment}直接拿segment变量的值(blue)拼成新路径/blue。
- 提取:
- 优点:简单、直观。只要
Path断言里抓到了变量,这里直接用就行,不用写复杂的正则。 - 生活类比:
RewritePath像是做整形手术,动刀子把原来的样子改成新的。SetPath像是搭积木,把原来的积木块(变量)拆下来,重新拼成一个新的形状。
- 原理:基于 URI 模板变量。它通常和
最佳实践: 如果你的路径修改逻辑比较简单(比如去掉前缀、重新排列路径段),优先使用 SetPath + Path 断言,可读性更高。