文章目录
- 1、网关过滤工厂介绍
- 2、 GatewayFilter 过滤器的基本配置
- 3、 Spring Cloud Gateway 内置 GatewayFilter Factories
- 3.1、AddRequestHeader GatewayFilter
- 3.2、AddResponseHeader GatewayFilter
- 3.3、AddRequestParameter GatewayFilter
- 3.4、RewritePath GatewayFilter
- 3.5、 RemoveRequestHeader GatewayFilter
- 3.6、 RemoveResponseHeader GatewayFilter
- 3.7、StripPrefix GatewayFilter
- 3.8、 SetPath GatewayFilter
- 3.9、 Retry GatewayFilter
- 3.10、CircuitBreaker GatewayFilter
- 3.11、RateLimit GatewayFilter
- 4、 组合多个 GatewayFilter
- 5、自定义 GatewayFilter
- 6、总结
1、网关过滤工厂介绍
在 Spring Cloud Gateway 中,GatewayFilter Factories(网关过滤工厂) 主要用于 拦截和修改 HTTP 请求或响应,可以在请求被路由到目标服务之前或者返回客户端之前进行处理。
作用范围:
前置过滤(Pre-Filter):在请求被转发到下游服务前执行,如权限校验、日志记录、参数修改等。
后置过滤(Post-Filter):在请求处理完毕返回响应时执行,如添加响应头、记录响应日志等。
路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的作用范围仅限于特定的路由。Spring Cloud Gateway 包含许多内置的 GatewayFilter 工厂。
2、 GatewayFilter 过滤器的基本配置
在 Spring Cloud Gateway 中,网关过滤器可以通过以下两种方式配置:
方式 1:YAML 配置
方式 2:Java 代码配置(基于 RouteLocator)
3、 Spring Cloud Gateway 内置 GatewayFilter Factories
Spring Cloud Gateway 提供了多个内置的过滤器工厂,下面是详细介绍。
3.1、AddRequestHeader GatewayFilter
在请求头中添加一个新的 Header
YAML 配置:
filters:
- AddRequestHeader=X-MyHeader, MyHeaderValue
Java 配置:
.filters(f -> f.addRequestHeader("X-MyHeader", "MyHeaderValue"))
✅ 示例:在所有请求中添加 X-MyHeader: MyHeaderValue
3.2、AddResponseHeader GatewayFilter
在响应头中添加一个新的 Header
YAML 配置:
filters:
- AddResponseHeader=X-Response-Header, ResponseValue
Java 配置:
.filters(f -> f.addResponseHeader("X-Response-Header", "ResponseValue"))
✅ 示例:在所有响应中添加 X-Response-Header: ResponseValue
3.3、AddRequestParameter GatewayFilter
在请求参数中添加一个新的参数
YAML 配置:
filters:
- AddRequestParameter=username, admin
Java 配置:
.filters(f -> f.addRequestParameter("username", "admin"))
✅ 示例:给请求添加 ?username=admin
3.4、RewritePath GatewayFilter
修改请求路径(支持正则表达式)
YAML 配置:
filters:
- RewritePath=/oldpath/(?<segment>.*), /newpath/$\{segment}
Java 配置:
.filters(f -> f.rewritePath("/oldpath/(?<segment>.*)", "/newpath/${segment}"))
✅ 示例:
请求 /oldpath/user/123 ➝ 重写为 /newpath/user/123
3.5、 RemoveRequestHeader GatewayFilter
移除某个请求头
filters:
- RemoveRequestHeader=Authorization
✅ 示例:移除 Authorization 头部,避免敏感信息泄露。
3.6、 RemoveResponseHeader GatewayFilter
移除某个响应头
filters:
- RemoveResponseHeader=Server
✅ 示例:隐藏 Server 响应头,提升安全性。
3.7、StripPrefix GatewayFilter
移除 URL 路径的前缀
YAML 配置:
filters:
- StripPrefix=2
✅ 示例:
http://gateway-service/api/v1/user
➝ 移除前 2 个路径部分
➝ 变为 http://backend-service/user
3.8、 SetPath GatewayFilter
直接替换整个 URL 路径
filters:
- SetPath=/new-path
✅ 示例:/old-path 直接变成 /new-path
3.9、 Retry GatewayFilter
在请求失败时自动重试
filters:
- name: Retry
args:
retries: 3
statuses: 500, 502
methods: GET, POST
✅ 示例:如果下游服务返回 500,最多重试 3 次。
3.10、CircuitBreaker GatewayFilter
实现熔断机制,依赖 Resilience4J
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fallback
✅ 示例:
如果某个服务调用失败,就执行 /fallback 逻辑
3.11、RateLimit GatewayFilter
限流
使用 Redis 进行限流
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
key-resolver: "#{@userKeyResolver}"
✅ 示例:
-
每秒最多 10 个请求
-
瞬时最大 20 个请求
4、 组合多个 GatewayFilter
多个 filters 可以一起使用:
filters:
- AddRequestHeader=X-MyHeader, Value
- RewritePath=/api/(?<segment>.*), /$${segment}
- Retry=3,500,GET
这个配置会:
添加请求头
重写路径
请求失败时重试
5、自定义 GatewayFilter
如果内置过滤器不能满足需求,可以自己扩展:
@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
6、总结
过滤器 | 作用 |
---|---|
AddRequestHeader | 添加请求头 |
AddResponseHeader | 添加响应头 |
RemoveRequestHeader | 移除请求头 |
RemoveResponseHeader | 移除响应头 |
RewritePath | 修改请求路径 |
SetPath | 直接替换路径 |
StripPrefix | 去除路径前缀 |
AddRequestParameter | 添加请求参数 |
Retry | 请求失败时重试 |
CircuitBreaker | 熔断处理 |
RateLimit | 限流 |
Spring Cloud Gateway提供了强大的请求和响应处理能力,可以结合多个过滤器实现复杂的网关功能! 🚀
需要有接受世事无常,接受孤独挫败的勇气