StripPrefix GatewayFilter 工厂
StripPrefix GatewayFilter 工厂接受一个参数 parts。 parts 参数指示在将请求发送到下游之前,要从请求路径中剥离的路径部分(parts)的数量。
以下示例配置了一个 StripPrefix GatewayFilter:
application.yml
yaml
spring:
cloud:
gateway:
routes:
- id: nameRoot
uri: https://nameservice
predicates:
- Path=/name/**
filters:
- StripPrefix=2当通过网关向 /name/blue/red 发起请求时,实际向 nameservice 发起的请求将变成 https://nameservice/red。
补充教学 —— 为什么要剥离前缀?
StripPrefix 是微服务网关中最常用的过滤器之一,几乎每个项目都会用到。
场景说明: 假设你有一个“用户服务(User Service)”,它的 API 接口定义是这样的:
/login/register
但是,在网关层,为了区分不同的服务,你希望对外暴露的路径带上服务名,用前缀来区分:
- 用户服务:
gateway.com/user/login - 订单服务:
gateway.com/order/create
问题来了: 当你请求 gateway.com/user/login 时,网关如果原封不动地转发给用户服务,用户服务收到的请求就是 /user/login。 可是用户服务如果不认识 /user 这个前缀,就会报错 404 Not Found。
解决方案: 这就需要 StripPrefix 出马了!它负责“脱衣服”——在转发前把网关加的那层前缀脱掉。
图解 StripPrefix 计算方式: 请求路径:/name/blue/red
| StripPrefix 值 | 剥离部分 | 最终转发路径 |
|---|---|---|
| 0 | (无) | /name/blue/red |
| 1 | /name | /blue/red |
| 2 | /name/blue | /red |
| 3 | /name/blue/red | / |
经典配置:
yaml
predicates:
- Path=/service-a/**
filters:
- StripPrefix=1这段配置的意思是:凡是以 /service-a 开头的请求,都转给 Service A,但在转发之前,先把 /service-a 这个前缀去掉,只发后面的部分。