1. 过滤器概述
Spring Cloud Gateway 的核心功能之一是过滤器(Filter),它可以在请求路由到目标服务之前(Pre)或之后(Post)对请求和响应进行修改、验证或记录。过滤器是网关实现鉴权、限流、日志、请求改写等功能的核心机制。
2. 过滤器分类
2.1 按作用范围分类
-
全局过滤器(Global Filter)
-
对所有路由生效,无需配置即可使用。
-
常见用途:全局鉴权、日志记录、跨域处理。
-
示例:NettyWriteResponseFilter(处理响应写入)。
-
-
局部过滤器(GatewayFilter)
-
需通过配置绑定到特定路由,仅对当前路由生效。
-
示例:AddRequestHeader、RequestRateLimiter。
-
2.2 按执行阶段分类
-
Pre Filter:在请求路由到目标服务前执行(如鉴权、修改请求头)。
-
Post Filter:在目标服务返回响应后执行(如修改响应头、记录日志)。
3. 过滤器执行流程
- Spring Cloud Gateway 的请求处理流程如下:
- 客户端请求 → Pre过滤器 → 路由转发 → 目标服务 → Post过滤器 → 返回响应
- 过滤器的执行顺序由 @Order 注解或 Ordered 接口实现决定,值越小优先级越高。
4. 内置过滤器示例
Spring Cloud Gateway 提供了多种内置过滤器:
过滤器名称 | 功能描述 |
---|---|
AddRequestHeader | 添加请求头 |
AddResponseHeader | 添加响应头 |
PrefixPath | 为请求路径添加前缀 |
Retry | 请求重试机制 |
RequestRateLimiter | 基于令牌桶算法的限流 |
StripPrefix | 移除路径前缀 |
配置示例(YAML)
spring:
cloud:
gateway:
routes:
- id: demo_route
uri: http://example.com
predicates:
- Path=/api/**
filters:
- AddRequestHeader=X-Gateway-Header, Hello
- StripPrefix=1 # 移除路径中的第一个前缀(如 /api/service → /service)
5. 自定义过滤器
5.1 自定义全局过滤器
实现 GlobalFilter 和 Ordered 接口:
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (!isValid(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete(); // 拦截请求
}
return chain.filter(exchange); // 放行
}
@Override
public int getOrder() {
return 0; // 执行顺序
}
}
5.2 自定义局部过滤器
需实现 GatewayFilterFactory,通常通过继承 AbstractGatewayFilterFactory:
@Component
public class LogFilterFactory extends AbstractGatewayFilterFactory<LogFilterFactory.Config> {
public LogFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
System.out.println("请求路径:" + exchange.getRequest().getPath());
return chain.filter(exchange);
};
}
public static class Config {
// 可添加配置参数
}
}
配置使用:
filters:
- Log # 自定义过滤器的名称需与类名(LogFilterFactory)去掉"FilterFactory"后的部分匹配
6. 常见应用场景
- 鉴权认证
- 校验 Token 或 JWT,拦截非法请求。
- 日志记录
- 记录请求路径、响应状态码及耗时。
- 限流熔断
- 结合 Redis 或 Sentinel 实现接口限流。
- 请求/响应修改
- 添加灰度发布标识头。
- 重写敏感响应字段。
7. 注意事项
-
执行顺序:全局过滤器与局部过滤器混合使用时,需通过 @Order 明确优先级。
-
性能影响:避免在过滤器中执行耗时操作(如同步远程调用)。
-
异常处理:自定义过滤器中需妥善处理异常,避免网关崩溃。
8. 总结
Spring Cloud Gateway 的过滤器机制提供了高度的灵活性,开发者可通过组合内置过滤器或自定义逻辑实现复杂的业务需求。理解过滤器的生命周期、执行顺序及适用场景,是构建高效网关服务的关键。