@Order和Ordered在gateway中的异常情况
使用场景
多个过滤器时,确定执行的先后顺序.注意是过滤器执行的先后顺序,不是加载的先后顺序
值越小,越先执行
@Component
public class GlobalLogFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
return -199;
}
}
@Component
@Order(-199)
public class GlobalLogFilter implements GlobalFilter{
}
注意
一般情况下,这两种写法效果相同,但是,在gateway中两者差别甚大
- 如果使用
@Order(-199)
写法,会先执行gatewayFilter
(虽然默认的order是10000),然后才执行GlobalFilter
- 如果使用
Ordered
接口写法,会按照order值从小到大执行
例如请求/sp/xxx/yyy接口:
gateway配置
- id: mkeke-sp
uri: lb://mkeke-sp
predicates:
- Path=/sp/**
filters:
- StripPrefix=1
过滤器中获取String url = exchange.getRequest().getURI().getPath();
- 如果使用
@Order(-199)
,url="/xxx/yyy",因为此时先执行gatewayFilter
- 如果使用
Ordered
接口,order=-199,url="/sp/xxx/yyy",因为此时先执行GlobalFilter
源码解读
在 FilteringWebHandler初始化时,将 GlobalFilter 委托成 GatewayFilterAdapter ,代码如下 :
1: public class FilteringWebHandler implements WebHandler {
2:
3: /**
4: * 全局过滤器
5: */
6: private final List<GatewayFilter> globalFilters;
7:
8: public FilteringWebHandler(List<GlobalFilter> globalFilters) {
9: this.globalFilters = loadFilters(globalFilters);
10: }
11:
12: private static List<GatewayFilter> loadFilters(List<GlobalFilter> filters) {
13: return filters.stream()
14: .map(filter -> {
15: GatewayFilterAdapter gatewayFilter = new GatewayFilterAdapter(filter);
16: if (filter instanceof Ordered) {
17: int order = ((Ordered) filter).getOrder();
18: return new OrderedGatewayFilter(gatewayFilter, order);
19: }
20: return gatewayFilter;
21: }).collect(Collectors.toList());
22: }
23: }
- 第 16 至 19 行 :当 GlobalFilter 子类实现了 org.springframework.core.Ordered 接口,在委托一层 OrderedGatewayFilter 。这样 AnnotationAwareOrderComparator#sort(List) 方法好排序。
- 第 20 行 :当 GlobalFilter 子类没有实现了 org.springframework.core.Ordered 接口,在 AnnotationAwareOrderComparator#sort(List) 排序时,顺序值为 Integer.MAX_VALUE 。
- 目前 GlobalFilter 都实现了 org.springframework.core.Ordered 接口。
你要是觉得写的还不错,就点个关注,可以评论区留下足迹,以后方便查看.
你要是觉得写的很辣鸡,评论区欢迎来对线!
欢迎转载!