RewritePath GatewayFilter 工厂
RewritePath GatewayFilter 工厂接受一个路径 regexp(正则表达式)参数和一个 replacement(替换)参数。 它使用 Java 正则表达式提供了一种灵活的方式来重写请求路径。
以下示例配置了一个 RewritePath GatewayFilter:
application.yml
yaml
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: https://example.org
predicates:
- Path=/red/**
filters:
- RewritePath=/red/?(?<segment>.*), /$\{segment}作用: 对于路径为 /red/blue 的请求,此配置会在发起下游请求之前将路径设置为 /blue。
注意:YAML 转义
请注意,由于 YAML 规范的原因,$ 应该被替换为 $\(在上述示例中,为了正确表示 ${segment} 变量的引用,写作了 /$\{segment})。
补充教学 —— 为什么要重写路径?
场景 1:去除 API 上下文前缀(最常用)
- 前端请求:前端为了方便管理,给所有请求加了前缀
/api,比如GET /api/users/1。 - 后端服务:后端微服务的接口定义并没有
/api,只有/users/1。 - 解决:使用
RewritePath把/api去掉。- 配置:
RewritePath=/api/?(?<segment>.*), /$\{segment} - 效果:
/api/users/1->/users/1
- 配置:
场景 2:版本兼容
- 前端请求:
GET /v1/service/hello - 后端重构:后端新版服务接口变了,需要映射到
/v2/new-service/hello。 - 解决:使用正则重写。
- 配置:
RewritePath=/v1/service/?(?<segment>.*), /v2/new-service/$\{segment}
- 配置:
原理主要靠正则捕获组:
(?<segment>.*)是一个命名捕获组,名字叫segment。它匹配/red/后面的所有内容。/$\{segment}是替换目标。它引用了刚才捕获的内容。- 所以
/red/blue匹配后,segment捕获到了blue,最终替换结果就是/blue。