本文只是为了我学习记录,内容不是太详细
一、核心过滤器分类及功能一览
| 分类 | 过滤器名称 | 作用说明 | 示例场景 |
|---|---|---|---|
| 请求处理 | 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)。
-
配置步骤:
-
添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId> </dependency> -
配置路由:
filters: - CircuitBreaker=myCircuitBreakerConfig -
定义熔断规则(
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?
常见原因
-
服务发现配置错误:
-
在 URI 中使用服务名(如
lb://user-service),但未启用服务发现(如缺少 Eureka/Nacos 依赖)。 -
解决:检查是否添加了服务发现依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
-
路由规则不匹配:
-
Predicates(如Path、Header)未命中请求。 -
验证方法:启用网关日志查看匹配过程:
logging: level: org.springframework.cloud.gateway: TRACE
-
-
过滤器配置错误:
-
路径改写(
RewritePath)参数格式错误。 -
示例错误:正则表达式未正确捕获分组,如下方配置无法匹配:
- RewritePath=/api/(.*), /$1 # 正确写法 - RewritePath=/api/, / # 错误(无法匹配子路径)
-
-
下游服务不可达:
-
直接 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