在微服务架构中,API网关是一个关键组件,它不仅负责请求路由,还提供过滤器链来处理各种横切关注点。Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Spring Boot 2 的 API 网关,它利用 WebFlux 反应式编程模型来构建非阻塞和高性能的 API 网关。本文将详细解释 Spring Cloud Gateway 中路由过滤器、defaultFilter 和全局过滤器的执行顺序。
一、过滤器类型
在 Spring Cloud Gateway 中,过滤器主要分为三种类型:
-
路由过滤器(Route Filter):与特定路由相关联的过滤器,用于处理特定路由的请求。
-
默认过滤器(Default Filter):Spring 框架提供的默认过滤器,用于处理所有路由的请求。
-
全局过滤器(Global Filter):全局应用于所有路由的过滤器,用于处理所有请求。

二、过滤器执行顺序
过滤器的执行顺序对于理解网关的行为至关重要。以下是过滤器执行顺序的规则:
-
Order 值越小,优先级越高:每个过滤器都必须指定一个
int类型的order值,order值越小,优先级越高,执行顺序越靠前。 -
当
order值相同时:如果多个过滤器的order值相同,它们的执行顺序为:defaultFilter 最先,然后是局部的路由过滤器,最后是全局过滤器。

三、过滤器的合并与执行
请求进入网关后,会将当前路由过滤器、DefaultFilter 和 GlobalFilter 合并到一个过滤器链(集合)中,然后根据 order 值进行排序并依次执行每个过滤器。
过滤器适配
路由的过滤器、DefaultFilter 的本质是一样的,都是 GatewayFilter。而全局过滤器(GlobalFilter)则不同,它们需要通过一个适配器(GatewayFilterAdapter)来适配成 GatewayFilter,以便在网关中使用。
java复制
private static class GatewayFilterAdapter implements GatewayFilter {
private final GlobalFilter delegate;
GatewayFilterAdapter(GlobalFilter delegate) {
this.delegate = delegate;
}
// 实现 GatewayFilter 的方法,委托给 GlobalFilter 执行
}
四、路由的过滤器,DefaultFilter,GlobalFilter为什么能放到一个集合当中?
路由的过滤器,DefaultFilter的本质是一样的,只不过作用的范围不一样,他们的本质都是GatewayFilter,全局过滤器可不是GatewayFilter,他们是有差别的,
在网关里面有一个过滤器适配器(GatewauFilterAdapter),这个适配器实现了GatewayFilter的接口,它的内部又接收了一个GlobalFilter,在这里会对GlobalFilter做一个适配,变成GatewayFilter去用,也就是说网关当中所有的GlobalFilter都会被适配成GatewayFilter,网关中所有过滤器最终都是GatewayFilter

五、总结
在 Spring Cloud Gateway 中,理解不同类型过滤器的执行顺序对于设计和优化网关至关重要。通过合理配置过滤器的 order 值,可以控制过滤器的执行顺序,从而满足不同的业务需求。同时,通过适配器将全局过滤器适配为路由过滤器,可以实现过滤器的统一管理和执行。


1001

被折叠的 条评论
为什么被折叠?



