过滤器原理和生命周期
前面我们学习了Gateway的路由和断言功能,这一节我们来了解下过滤器原理,再挑几个常用的过滤器学习一下。
1、过滤器的工作模式
所有开源框架实现过滤器的模式都是大同小异,通过一种类似职责链的方式,传统的职责链模式中的事件会传递直到有一个处理对象接手,而过滤器和传统的职责链有点不同,它更像是足球队开场握手一样,所有队员一字排开,你要从头到尾依次和所有球员握过手。
Gateway中的过滤器也是一样的模型,他们经过优先级的排列,所有网关调用请求从最高优先级的过滤器开始。一路走到头,直到被最后一个过滤器处理。
2、过滤器的实现方式
在Gateway中实现一个过滤器非常简单,只要实现GatewayFilter接口的默认方法就好了
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 随意发挥
return chain.filter(exchange);
}
这里面有两个关键信息:
ServerWebExchange: 这是Spring封装的HTTP request-response交互协议,从中我们可以获取request和response中的各种请求参数,也可以向其中添加内容;
GatewayFilterChain: 它是过滤器的调用链,在方法结束的时候我们需要将exchange对象传入调用链中的下一个对象。
3、过滤器的执行阶段
不同于Spring Cloud中上一代网关组件Zuul里对过滤器的Pre和Post的定义,Gateway是通过Filter中的代码来实现类似Pre和Post的效果。
Pre和Post是指代当前过滤器的执行阶段,Pre是在下一个过滤器之前被执行,Post是在过滤器执行过后再执行,我们在Gateway Filter中也可以同时定义Pre和Post执行逻辑。
3.1、Pre类型
我们就拿 AddResponseHeaderGatewayFilterFactory
举例,它可以向 Response 中添加 Header 信息:
@Over