请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器
问题:当前路由过滤器和DefaultFilter、GlobalFilter 这是三个不同类型的过滤器,如何将其放到一个集合中并排序呢?
实际上 路由过滤器 和 DefaultFilter ,非常接近,只不过一个放在路由器内,一个放在路由器外
上图中的两个AddRequestHeader,他们在java的底层都来源于同一个过滤器工厂,生成的真正过滤器都是GatewayFilter,所以我们认为 路由过滤器 和 DefaultFilter 都是同一种过滤器 GatewayFilter
在网关中,有一个过滤器适配器,如下,其实现了 GatewayFilter 接口,我们开到其内部有个GlobalFiler属性,我们只要将 GlobalFiler 传入,该适配器就能将GlobalFiler 变为GatewayFilter
也就是在网关中,所有的过滤器都会被适配为GatewayFilter,至此就解决了三种过滤器类型不同的问题
问题:如何排序?
- 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
- GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
- 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增,如下
- 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行