在 Spring Cloud Gateway 中,getOrder详解
在 Spring Cloud Gateway 中,GlobalFilter
是用于过滤和处理 HTTP 请求的过滤器接口,而 Ordered
接口允许你定义多个过滤器之间的执行顺序。
关于 getOrder()
的执行顺序:
-
值越小,优先级越高:Spring 会按照
getOrder()
的返回值进行排序,值越小的过滤器优先执行。 -
getOrder()
返回 0:如果多个过滤器的getOrder()
返回的值相同,它们的执行顺序将取决于 Spring 内部的具体执行机制,可能会导致顺序不稳定。 -
getOrder()
返回负数(如 -1):比 0 更高的优先级,这样该过滤器会在返回 0 的过滤器之前执行。 -
顺序冲突: 如果你的过滤器
getOrder()
返回 0,而系统中有多个过滤器也返回 0,则它们之间的执行顺序可能不确定。Spring Cloud Gateway 在同一个优先级中(getOrder()
返回相同值的过滤器)不保证执行顺序,这可能导致你的过滤器在意料之外的时机执行。 -
系统默认过滤器的顺序: Spring Cloud Gateway 和 Spring 本身有一些默认的过滤器,它们可能设置了与 0 相同的执行优先级。如果你不希望你的过滤器与这些默认的过滤器同时执行,那么应该选择一个更高或更低的优先级来避免冲突。
Spring 内置的过滤器
Spring Cloud Gateway 内置了一些全局过滤器,每个过滤器都有自己的默认顺序。以下是一些常见的内置过滤器及其默认顺序:
NettyWriteResponseFilter
:getOrder()
返回 -1。它是负责将响应写回到客户端的最后一个过滤器。GatewayMetricsFilter
:getOrder()
返回 0。用于收集网关性能指标。WebsocketRoutingFilter
:getOrder()
返回 1。处理 WebSocket 请求的过滤器。RoutingFilter
:getOrder()
返回 2147483647(Integer.MAX_VALUE
)。处理实际路由请求的过滤器。
默认过滤器顺序
如果你自定义了过滤器并实现了 Ordered
接口,但没有重写 getOrder()
方法,默认的优先级取决于 Ordered
接口的实现。
- 如果没有实现
Ordered
接口,Spring 框架会将它视为 无优先级 的过滤器,其执行顺序将由 Spring 框架根据其他实现的getOrder()
方法决定。
未实现 Ordered
接口的情况
如果你定义的过滤器没有实现 Ordered
接口,过滤器的顺序将无法由你直接控制,Spring Cloud Gateway 会将它放置在一个默认的顺序中,这通常是较低优先级的顺序。
如何查看某个过滤器的默认 getOrder()
值?
如果你想了解某个具体过滤器的默认执行顺序,可以查看对应过滤器的源码,寻找 getOrder()
方法的实现。例如:
java
复制代码
@Override public int getOrder() { return 0; // 默认顺序为 0 }
自定义过滤器顺序
通过实现 Ordered
接口,你可以自定义过滤器的执行顺序。例如:
java
复制代码
public class CustomGlobalFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
return -1; // 设置为 -1 保证优先执行
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 自定义过滤器逻辑
return chain.filter(exchange);
}
}
- 内置过滤器的顺序 是预先定义好的,常见的过滤器例如
NettyWriteResponseFilter
为 -1,RoutingFilter
为最大整数值(Integer.MAX_VALUE
)。 - 如果你自定义过滤器且实现了
Ordered
接口,顺序是你自己定义的;如果没有实现Ordered
,它将没有明确的顺序。