1.前言
SpringCloud 虽然给我们提供了很多过滤器,但是这些过滤器功能都是固定的,无法满足用户的各式各样的需求。因此SpringCloud提供了过滤器的扩展功能自定过滤器。
开发者可以根据自己的业务需求自定义过滤器。
2. 自定义 GatewayFilter(局部过滤器)
-
GatewayFilter 则是局部过滤器,它们可以应用到特定的路由或者路径上。通过将过滤器应用到特定的路由配置中,可以使得这些过滤器只在特定的请求路径下生效。
通常情况下,GatewayFilter 可以分为两类:
-
Pre 过滤器:在请求被路由到目标服务之前执行。例如,可以在此类过滤器中进行身份验证、日志记录、请求修改等操作。
-
Post 过滤器:在请求被路由到目标服务之后执行。通常用于记录响应日志、修改响应、添加响应头等操作。
Spring Cloud Gateway 中的过滤器可以按照顺序链式执行,从而实现复杂的请求处理逻辑。通过自定义和组合不同的过滤器,可以满足各种场景下的需求。
2.1 代码实现
1. 编写一个类,继承的抽象类是 AbstractGatewayFilterFactory创建自定义的局部网关过滤器,用于接收过滤器的配置参数。
实现 Ordered 用于自定义过滤器的执行顺序。
/**
* @Description: 自定义Gateway过滤器
* @Author: windStop
* @Date: 2024/6/6 9:58
*/
@Component
@Slf4j
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomConfig> implements Ordered {
//表示过滤器要接收到一个什么类型的参数才能正常运行
public CustomGatewayFilterFactory() {
super(CustomConfig.class);
}
@Override
public GatewayFilter apply(CustomConfig config) {
return new GatewayFilter() {
/**
*
* @param exchange HTTP请求和响应 交互的契机,提供了对HTTP 请求和响应的访问
* 通俗的讲,就是封装了request和response
* @param chain 过滤器链
* Mono : 是Reactor的核心类,数据流的发布者,Mono最多只能触发一个事件,可以把Mono用在异步完成任务时,发出通知
* @return chain.filter(exchange) 执行请求
* Mono.fromRunnable(): 创建一个包含Runnable的数据流 创建一个任务
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//Pre 类型执行请求 post类型 执行
log.info("pre Filter:{},",config);//Pre过滤器 的逻辑
return chain.filter(exchange).then(Mono.fromRunnable(()->{
log.info("Post Filter....");//Post类型过滤器的逻辑
}));
}
};
}
//设置优先级
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
2.2 代码介绍
-
public CustomGatewayFilterFactory() {super(CustomConfig.class);}
: 这是CustomGatewayFilterFactory
的构造函数,其中调用了父类AbstractGatewayFilterFactory
的构造函数,指定了过滤器接收的配置参数类型为CustomConfig.class
。 -
@Override public GatewayFilter apply(CustomConfig config) {...}
: 这是AbstractGatewayFilterFactory
类中的抽象方法,用于创建并返回一个自定义的网关过滤器。在这里,根据传入的配置参数config
,创建了一个GatewayFilter
实例,并在filter
方法中编写了过滤器的逻辑。
其中的参数介绍:exchange HTTP请求和响应 交互的契机,提供了对HTTP 请求和响应的访问 通俗的讲,就是封装了request和response @param chain 过滤器链 Mono : 是Reactor的核心类,数据流的发布者,Mono最多只能触发一个事件,可以把Mono用在异步完成任务时,发出通知 @return chain.filter(exchange) 执行请求 Mono.fromRunnable(): 创建一个包含Runnable的数据流 创建一个任务,线程的方式。
-
@Override public int getOrder() {return Ordered.LOWEST_PRECEDENCE;}
: 这是实现了Ordered
接口中的getOrder
方法,用于设置过滤器的执行顺序。在这里,返回了一个常量Ordered.LOWEST_PRECEDENCE
,表示该过滤器的执行优先级最低,会在所有其他过滤器之后执行。
总的来说,这段代码定义了一个自定义的 Gateway 过滤器工厂,用于创建自定义的网关过滤器,并且指定了过滤器的配置参数类型、过滤器的执行逻辑以及执行顺序。
2.3 配置文件
这里声明过滤器的name要和GatewayFilterFactory的前缀一样才可以自动映射,args为需要将参数进行传递。
3. 自定义 GlobalFilter(全局过滤器)
3.1 代码实现
/**
* @Description: 全局过滤器
* @Author: windStop
* @Date: 2024/6/6 18:23
*/
@Slf4j
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
/**
* 实现全局的过滤器
* @param exchange 封装了request和response方法
* @param chain 过滤器链
* @return
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("Pre Global Filter");
return chain.filter(exchange).then(Mono.fromRunnable(()->{
log.info("Post Global Filter");
}));
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
因为和上述相似就不介绍了
3.2 配置文件
不需要任何配置文件,因为他是对我们所有的路由都进行生效的。
4. 总结
这份文档主要介绍了在Spring Cloud Gateway中如何自定义局部过滤器(GatewayFilter)和全局过滤器(GlobalFilter),以及它们的实现步骤和配置方式。
-
局部过滤器(GatewayFilter):
- 通过继承
AbstractGatewayFilterFactory
类创建自定义过滤器工厂,实现apply()
方法来定义过滤器的逻辑。 - 过滤器逻辑中,可以对请求进行预处理(Pre类型)或者后处理(Post类型)。
- 使用
Mono<Void>
作为返回类型,表示过滤器的异步执行结果。 - 通过实现
Ordered
接口来设置过滤器的执行顺序。
- 通过继承
-
全局过滤器(GlobalFilter):
- 实现
GlobalFilter
接口来定义全局过滤器,它会对所有的路由都生效。 - 同样使用
Mono<Void>
作为返回类型,并在逻辑中调用chain.filter(exchange)
来执行后续过滤器和路由处理。
- 实现
-
配置文件:
- 对于局部过滤器,需要在配置文件中声明过滤器的名称和参数。
- 对于全局过滤器,则不需要任何配置文件,因为它会对所有路由生效。
总的来说,这份文档清晰地展示了如何在Spring Cloud Gateway中扩展和定制过滤器,以满足不同场景下的需求。自定义过滤器能够帮助开发者实现更加灵活和精细的请求处理逻辑。