请求进入网关会碰到三类过滤器:当前路由的过滤器、
DefaultFilter
、GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter
、GlobalFilter
,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器.
概述
- 每一个过滤器都必须指定一个
int
类型的order值,order
值越小,优先级越高,执行顺序越靠前。 GlobalFilter
通过实现Ordered
接口,或者添加@Order
注解来指定order
值,由我们自己指定- 路由过滤器和
defaultFilter
的order
由Spring
指定,默认是按照声明顺序从1递增。 - 当过滤器的
order
值一样时,会按照defaultFilter
> 路由过滤器 >GlobalFilter
的顺序执行。
org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()
方法是先加载defaultFilters
,然后再加载某个route
的filters
,然后合并。
org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()
方法会加载全局过滤器,与前面的过滤器合并后根据order
排序,组织过滤器链
总结
路由过滤器、defaultFilter、全局过滤器的执行顺序?
- order值越小,优先级越高
- 当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器