Skip to content

StripPrefix GatewayFilter 工厂

StripPrefix GatewayFilter 工厂接受一个参数 partsparts 参数指示在将请求发送到下游之前,要从请求路径中剥离的路径部分(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 这个前缀去掉,只发后面的部分。

Based on Spring Framework.