@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();

  1. 如果使用@Order(-199),url="/xxx/yyy",因为此时先执行gatewayFilter
  2. 如果使用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 接口。
posted @ 2022-12-13 17:23  rm-rf*  阅读(334)  评论(0编辑  收藏  举报