Spring Cloud Gateway 路由规则配置实践

经过不断测试,得出如下测试结果:

配置方案1:测试失败

报错:(502 Bad Gateway)The page is temporarily unavailable

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: nos-web-service-rwlb
          uri: lb://nos-web-service
          predicates:
            - Path=/im/v1.0/service/order/queryOrderDetail
          filters:
            - StripPrefix=4
            - RewritePath=/?(?<segment>.*) /nosAdmin/external/vehicleOrder/${segment}

配置方案2:测试失败

报错:禁止访问资源

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: nos-web-service-rwlb
          uri: lb://nos-web-service
          predicates:
            - Path=/im/v1.0/service/order/queryOrderDetail
          filters:
            - StripPrefix=4
            - RewritePath=/?(?<segment>.*), /nosAdmin/external/vehicleOrder/${segment}

配置方案3:测试失败

报错:禁止访问资源

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: nos-web-service-rwlb
          uri: lb://nos-web-service
          predicates:
            - Path=/im/v1.0/service/order/queryOrderDetail
          filters:
            - StripPrefix=4
            - RewritePath=/?(?<segment>.*), /nosAdmin/external/vehicleOrder/$\{segment}

配置方案4:测试失败

报错:(502 Bad Gateway)The page is temporarily unavailable

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: nos-web-service-rwlb
          uri: lb://nos-web-service
          predicates:
            - Path=/im/v1.0/service/order/queryOrderDetail
          filters:
            - StripPrefix=3
            - RewritePath=/order/?(?<segment>.*) /nosAdmin/external/vehicleOrder/${segment}

配置方案5:测试成功

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: nos-web-service-rwlb
          uri: lb://nos-web-service
          predicates:
            - Path=/im/v1.0/service/order/queryOrderDetail
          filters:
            - StripPrefix=3
            - RewritePath=/order/?(?<segment>.*), /nosAdmin/external/vehicleOrder/${segment}

配置方案6:测试成功

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: nos-web-service-rwlb
          uri: lb://nos-web-service
          predicates:
            - Path=/im/v1.0/service/order/queryOrderDetail
          filters:
            - StripPrefix=3
            - RewritePath=/order/?(?<segment>.*), /nosAdmin/external/vehicleOrder/$\{segment}

报错:(502 Bad Gateway)The page is temporarily unavailable

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: nos-web-service-rwlb
          uri: lb://nos-web-service
          predicates:
            - Path=/im/v1.0/service/order/queryOrderDetail
          filters:
            - RewritePath=/im/v1.0/service/order/?(?<segment>.*) /nosAdmin/external/vehicleOrder/$\{segment}
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: nos-web-service-rwlb
          uri: lb://nos-web-service
          predicates:
            - Path=/im/v1.0/service/order/queryOrderDetail
          filters:
            - RewritePath=/im/v1.0/service/order/?(?<segment>.*), /nosAdmin/external/vehicleOrder/$\{segment}
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: nos-web-service-rwlb
          uri: lb://nos-web-service
          predicates:
            - Path=/im/v1.0/service/order/queryOrderDetail
          filters:
            - RewritePath=/im/v1.0/service/order/queryOrderDetail, /nosAdmin/external/vehicleOrder/queryOrderDetail

官网案例(Spring Cloud Gateway 4.0.9

结论

  • 实践证明,RewritePath中2个路径之间必须加“逗号”
  • 实践证明,$ 可以不用替换成 $\,但建议按照官网要求使用 $\
  • 推荐使用配置方案5、6、8,优先级6>=8>5。这两个方案,可以对predicates中的Path进行正则匹配,也符合了真实应用场景