【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter
【这三种过滤器的执行顺序是什么样的?】
请求路由后【意思首先得通过路由规则,过都过不去,过滤个空气】,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器
示意图:
其实路由过滤器和DefaultFilter 是同一类,都是GatewayFilter
GlobalFilter 也可以被适配成 GatewayFilter
所以粗略地说, 他们仨都是同一种类型,所以可以在集合中实现排序
【所以怎么排序?】
每一个过滤器都必须指定一个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、全局过滤器的执行顺序?