SpringCloud Gateway常见过滤器

103 阅读2分钟

  本文只是为了我学习记录,内容不是太详细


一、核心过滤器分类及功能一览

分类过滤器名称作用说明示例场景
请求处理AddRequestHeader为请求添加头部信息传递用户身份、标记请求来源
RemoveRequestHeader移除指定请求头清理敏感信息(如原始Cookie)
AddRequestParameter添加请求参数强制补全参数(如debug模式)
路径处理RewritePath重写请求路径接口版本迁移(如/v1/api -> /api
PrefixPath添加路径前缀统一网关路由前缀(如/service前置)
StripPrefix移除路径前缀剥离网关暴露的前缀(/gateway/xxx -> /xxx
响应处理AddResponseHeader添加响应头添加请求ID或链路追踪标记
RemoveResponseHeader移除指定响应头隐藏服务器技术栈信息(如X-Powered-By
容错与安全CircuitBreaker熔断机制(需依赖Resilience4J)服务不可用时快速失败
Retry请求失败自动重试应对下游服务短暂故障
RequestRateLimiter请求限流(需Redis)防止API被过度调用
高级处理ModifyRequestBody修改请求体内容内容加密、格式转换

二、常用过滤器详解

1. AddRequestHeader

  • 用途:添加请求头,常用于传递额外信息(如用户身份)。

  • 配置格式

    - AddRequestHeader=Header-Name, Header-Value
    
  • 示例

    filters:
      - AddRequestHeader=X-User-Id, 12345
    
  • 验证方法

    # 发送请求后验证下游服务是否收到该头
    curl http://gateway-host/api/check-headers -H "Host: example.org"
    # 下游服务打印请求头应输出 X-User-Id: 12345
    

2. RewritePath

  • 用途:重写路径,支持正则表达式替换。

  • 配置格式

    - RewritePath=原始路径正则表达式, 替换后的路径
    
  • 示例

    filters:
      - RewritePath=/api/v1/(?<segment>.*), /${segment}
    
  • 效果举例: 原始请求路径 /api/v1/users/123 → 实际请求 http://下游服务/users/123

3. Retry

  • 用途:请求失败时重试(如超时、服务不可用)。

  • 参数格式

    - Retry=重试次数, HTTP状态码或异常类型
    
  • 示例

    filters:
      - Retry=3, INTERNAL_SERVER_ERROR,SERVICE_UNAVAILABLE
    
    • 当响应状态码为5xx时,最多重试3次。

4. CircuitBreaker

  • 用途:熔断保护,防止级联故障(需集成Resilience4J)。

  • 配置步骤

    1. 添加依赖:

      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
      </dependency>
      
    2. 配置路由:

      filters:
        - CircuitBreaker=myCircuitBreakerConfig
      
    3. 定义熔断规则(application.yml):

      resilience4j:
        circuitbreaker:
          configs:
            default:
              failureRateThreshold: 50    # 故障率阈值(50%)
              minimumNumberOfCalls: 5     # 最小调用次数
              slidingWindowType: TIME_BASED
              slidingWindowSize: 10       # 时间窗口大小(秒)
      

三、过滤器执行顺序规则

过滤器按声明顺序依次执行,请求阶段(Request Phase)响应阶段(Response Phase) 逻辑分离:

filters:
  - AddRequestHeader=X-Phase, RequestFilter1       # (1) 最先执行
  - AddRequestHeader=X-Phase, RequestFilter2       # (2)
  - AddResponseHeader=X-Phase, ResponseFilter1     # (3) 响应阶段先执行(在请求阶段之后)
  - AddResponseHeader=X-Phase, ResponseFilter2     # (4)

四、错误排查 - 为什么 network error

常见原因

  1. 服务发现配置错误

    • 在 URI 中使用服务名(如lb://user-service),但未启用服务发现(如缺少 Eureka/Nacos 依赖)。

    • 解决:检查是否添加了服务发现依赖:

      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
      
  2. 路由规则不匹配

    • Predicates(如PathHeader)未命中请求。

    • 验证方法:启用网关日志查看匹配过程:

      logging:
        level:
          org.springframework.cloud.gateway: TRACE
      
  3. 过滤器配置错误

    • 路径改写(RewritePath)参数格式错误。

    • 示例错误:正则表达式未正确捕获分组,如下方配置无法匹配:

      - RewritePath=/api/(.*), /$1   # 正确写法
      - RewritePath=/api/, /         # 错误(无法匹配子路径)
      
  4. 下游服务不可达

    • 直接 URI(如https://example.org)指向的地址无法访问。

    • 检查步骤

      ping example.org
      telnet example.org 80
      

五、完整配置示例

**

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service  # 通过服务名负载均衡
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1                # 移除 /api
            - AddRequestHeader=X-User-ID, 1001
            - RewritePath=/users/(?<id>.*), /user-info/${id}
            - Retry=2, TIMEOUT             # 超时重试2次
            - CircuitBreaker=userServiceCB