在 Spring Cloud Gateway 中,GatewayFilter Factories(网关过滤工厂) 主要用于 拦截和修改 HTTP 请求或响应,可以在请求被路由到目标服务之前或者返回客户端之前进行处理。
作用范围:
前置过滤(Pre-Filter):在请求被转发到下游服务前执行,如权限校验、日志记录、参数修改等。
后置过滤(Post-Filter):在请求处理完毕返回响应时执行,如添加响应头、记录响应日志等。
路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的作用范围仅限于特定的路由。Spring Cloud Gateway 包含许多内置的 GatewayFilter 工厂。
在 Spring Cloud Gateway 中,网关过滤器可以通过以下两种方式配置:
方式 1:YAML 配置
方式 2:Java 代码配置(基于 RouteLocator)
Spring Cloud Gateway 提供了多个内置的过滤器工厂,下面是详细介绍。
在请求头中添加一个新的 Header
YAML 配置:
filters:
- AddRequestHeader=X-MyHeader, MyHeaderValue
Java 配置:
.filters(f -> f.addRequestHeader("X-MyHeader", "MyHeaderValue"))
✅ 示例:在所有请求中添加 X-MyHeader: MyHeaderValue
在响应头中添加一个新的 Header
YAML 配置:
filters:
- AddResponseHeader=X-Response-Header, ResponseValue
Java 配置:
.filters(f -> f.addResponseHeader("X-Response-Header", "ResponseValue"))
✅ 示例:在所有响应中添加 X-Response-Header: ResponseValue
在请求参数中添加一个新的参数
YAML 配置:
filters:
- AddRequestParameter=username, admin
Java 配置:
.filters(f -> f.addRequestParameter("username", "admin"))
✅ 示例:给请求添加 ?username=admin
修改请求路径(支持正则表达式)
YAML 配置:
filters:
- RewritePath=/oldpath/(?>.*), /newpath/$\{segment}
Java 配置:
.filters(f -> f.rewritePath("/oldpath/(?.*)" , "/newpath/${segment}"))
✅ 示例:
请求 /oldpath/user/123 ➝ 重写为 /newpath/user/123
移除某个请求头
filters:
- RemoveRequestHeader=Authorization
✅ 示例:移除 Authorization 头部,避免敏感信息泄露。
移除某个响应头
filters:
- RemoveResponseHeader=Server
✅ 示例:隐藏 Server 响应头,提升安全性。
移除 URL 路径的前缀
YAML 配置:
filters:
- StripPrefix=2
✅ 示例:
http://gateway-service/api/v1/user
➝ 移除前 2 个路径部分
➝ 变为 http://backend-service/user
直接替换整个 URL 路径
filters:
- SetPath=/new-path
✅ 示例:/old-path 直接变成 /new-path
在请求失败时自动重试
filters:
- name: Retry
args:
retries: 3
statuses: 500, 502
methods: GET, POST
✅ 示例:如果下游服务返回 500,最多重试 3 次。
实现熔断机制,依赖 Resilience4J
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fallback
✅ 示例:
如果某个服务调用失败,就执行 /fallback 逻辑
限流
使用 Redis 进行限流
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
key-resolver: "#{@userKeyResolver}"
✅ 示例:
每秒最多 10 个请求
瞬时最大 20 个请求
多个 filters 可以一起使用:
filters:
- AddRequestHeader=X-MyHeader, Value
- RewritePath=/api/(?>.*), /$${segment}
- Retry=3,500,GET
这个配置会:
添加请求头
重写路径
请求失败时重试
如果内置过滤器不能满足需求,可以自己扩展:
@Component
public class CustomGatewayFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest().mutate()
.header("X-Custom-Header", "MyValue")
.build();
return chain.filter(exchange.mutate().request(request).build());
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
✅ 这个过滤器会自动在所有请求中添加 X-Custom-Header: MyValue
名称 参数 | (个数/类型) | 作用 |
---|---|---|
AddRequestHeader | 2/string | 添加请求头 |
AddRequestHeadersIfNotPresent | 1/List | 如果没有则添加请求头,key:value方式 |
AddRequestParameter | 2/string、string | 添加请求参数 |
AddResponseHeader | 2/string、string | 添加响应头 |
CircuitBreaker | 1/string | 仅支持forward:/inCaseOfFailureUseThis方式进行熔断 |
CacheRequestBody | 1/string | 缓存请求体 |
DedupeResponseHeader | 1/string | 移除重复响应头,多个用空格分割 |
FallbackHeaders | 1/string | 设置Fallback头 |
JsonToGrpc | 请求体Json转为gRPC | |
LocalResponseCache | 2/string | 响应数据本地缓存 |
MapRequestHeader | 2/string | 把某个请求头名字变为另一个名字 |
ModifyRequestBody | 仅 Java 代码方式 | 修改请求体 |
ModifyResponseBody | 仅 Java 代码方式 | 修改响应体 |
PrefixPath | 1/string | 自动添加请求前缀路径 |
PreserveHostHeader | 0 | 保护Host头 |
RedirectTo | 3/string | 重定向到指定位置 |
RemoveJsonAttributesResponseBody | 1/string | 移除响应体中的某些Json字段,多个用,分割 |
RemoveRequestHeader | 1/string | 移除请求头 |
RemoveRequestParameter | 1/string | 移除请求参数 |
RemoveResponseHeader | 1/string | 移除响应头 |
RequestHeaderSize | 2/string | 设置请求大小,超出则响应431状态码 |
RequestRateLimiter | 1/string | 请求限流 |
RewriteLocationResponseHeader | 4/string | 重写Location响应头 |
RewritePath | 2/string | 路径重写 |
RewriteRequestParameter | 2/string | 请求参数重写 |
RewriteResponseHeader | 3/string | 响应头重写 |
SaveSessio | n 0 | session保存,配合spring-session框架 |
SecureHeaders | 0 | 安全头设置 |
SetPath | 1/string | 路径修改 |
SetRequestHeader | 2/string | 请求头修改 |
SetResponseHeader | 2/string | 响应头修改 |
SetStatus | 1/int | 设置响应状态码 |
StripPrefix | 1/int | 路径层级拆除 |
Retry | 7/string | 请求重试设置 |
RequestSize | 1/string | 请求大小限定 |
SetRequestHostHeader | 1/string | 设置Host请求头 |
TokenRelay | 1/string | OAuth2的token转发 |
Spring Cloud Gateway提供了强大的请求和响应处理能力,可以结合多个过滤器实现复杂的网关功能!
需要有接受世事无常,接受孤独挫败的勇气