当前位置: 首页 > news >正文

专业网络推广软件南京seo排名外包

专业网络推广软件,南京seo排名外包,手机电商网站 模板,服务器迁移对做网站的影响过滤器的种类 Spring-Cloud-Gateway中提供了3种类型的过滤器,分别是:路由过滤器、Default过滤器和Global过滤器。 路由过滤器和Default过滤器 路由过滤器和Default过滤器本质上是同一种过滤器,只不过作用范围不一样,路由过滤器…

过滤器的种类

Spring-Cloud-Gateway中提供了3种类型的过滤器,分别是:路由过滤器、Default过滤器和Global过滤器。

路由过滤器和Default过滤器

路由过滤器和Default过滤器本质上是同一种过滤器,只不过作用范围不一样,路由过滤器只针对单个路由起作用,而Default过滤器对整个路由表中所有的路由都起作用,这2个过滤器的处理逻辑都是Spring已经内置好的,无须开发人员来写代码,只需要做一下配置即可。

Spring已经提供好了30多种这样的过滤器,比如:

  • AddRequestHeader
  • AddRequestParameter
  • StripPrefix

  • 这些过滤器都是org.springframework.cloud.gateway.filter.GatewayFilter的子类,每一种过滤器都是由一种过滤器工厂来生成的,比如:
  • AddRequestHeaderGatewayFilterFactory生成AddRequestHeader的过滤器
  • AddRequestParameterGatewayFilterFactory生成AddRequestParameter的过滤器
  • StripPrefixGatewayFilterFactory生成StripPrefix的过滤器

Global过滤器

Global过滤器与上面两个不一样,Global过滤器需要开发人员自己来实现业务逻辑,并且它是org.springframework.cloud.gateway.filter.GlobalFilter的子类。

过滤器的执行顺序

如果是Global过滤器,可以让Global过滤器实现org.springframework.core.Ordered接口来设置过滤器的顺序,但是这里注意@org.springframework.core.annotation.Order这个注解是不起作用的。

如果是路由过滤器和Default过滤器,他们的处理逻辑是Spring内置的,因此,他们的顺序是按照声明的顺序,从1开始递增的,比如:

      routes:- id: userserviceuri: lb://userservicepredicates:- Path=/user/**filters:- AddRequestHeader=RouterFilter1, router1- AddRequestHeader=RouterFilter2, router2default-filters:- AddRequestHeader=DefaultFilter1, default1- AddRequestHeader=DefaultFilter1, default2

以上的配置种,router1的order是1,router2的order是2,default1的order是1,default2的order是2,也就是说按照他们声明的顺序,从1往上递增。

那么,当系统中同时存在这么多过滤器的时候,他们的执行顺序是什么样子的呢?比如,我现在同时定义了GlobalFilter1和GlobalFilter2,还有配置了router1、router2、default1、default2的时候:

@Component
public class GlobalFilter1 implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("============global1=============");return chain.filter(exchange);}@Overridepublic int getOrder() {return 2;}
}

还有GlobalFilter2:

@Component
public class GlobalFilter2 implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("============global2=============");return chain.filter(exchange);}@Overridepublic int getOrder() {return 1;}
}

只需要在org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()上打断点看一下即可:

@Override
public Mono<Void> handle(ServerWebExchange exchange) {Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);// 拿到所有的路由过滤器,包含了Default过滤器List<GatewayFilter> gatewayFilters = route.getFilters();// 拿到所有的Global过滤器List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);// 先添加的Global过滤器,然后再添加的路由过滤器combined.addAll(gatewayFilters);// TODO: needed or cached?AnnotationAwareOrderComparator.sort(combined);if (logger.isDebugEnabled()) {logger.debug("Sorted gatewayFilterFactories: " + combined);}// 在这一行打断点,查看下combined之后的内容return new DefaultGatewayFilterChain(combined).filter(exchange);
}

如下:
在这里插入图片描述
从源码种可以看出来,是先添加的Global过滤器,然后再添加的路由过滤器,从上面的截图也可以看出来,GlobalFilter2排在最前面,后面依次是default1、router1、GlobalFilter1、default2、router2。

可以继续在org.springframework.cloud.gateway.filter.factory.AddRequestHeaderGatewayFilterFactory#filter()方法和GlobalFilter上打断点,看一下后续的执行顺序。

因此,这些过滤器的执行顺序首先是根据order进行的排序,如果order相同,优先级是Global>Default>Router。

3种过滤器的类型都不一样为啥可以在一块进行排序?

Global过滤器是org.springframework.cloud.gateway.filter.GlobalFilter的子类,但是路由过滤器和Default过滤器是org.springframework.cloud.gateway.filter.GatewayFilter的子类,他们为啥可以放在一个集合中进行排序呢?
还是看org.springframework.cloud.gateway.handler.FilteringWebHandler这个类,它里面有一个loadFilters()方法:

private static List<GatewayFilter> loadFilters(List<GlobalFilter> filters) {return filters.stream().map(filter -> {// 把GlobalFilter适配成了GatewayFilterAdapterGatewayFilterAdapter gatewayFilter = new GatewayFilterAdapter(filter);// 并且这里计算顺序的时候,只是从Ordered接口取的if (filter instanceof Ordered) {int order = ((Ordered) filter).getOrder();return new OrderedGatewayFilter(gatewayFilter, order);}return gatewayFilter;}).collect(Collectors.toList());
}
// GatewayFilterAdapter 就实现了GatewayFilter接口
private static class GatewayFilterAdapter implements GatewayFilter {private final GlobalFilter delegate;GatewayFilterAdapter(GlobalFilter delegate) {this.delegate = delegate;}@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {return this.delegate.filter(exchange, chain);}
}

从上面的源码可以看出来,gateway框架在启动的时候,会把系统中所有的GlobalFilter适配成GatewayFilterAdapter ,而GatewayFilterAdapter 是实现了GatewayFilter 接口的,因此GlobalFilter也就适配成了GatewayFilter ,因此他们是可以放到一个集合进行排序的。同时可以看到,在获取GlobalFilter的order时候,只是使用Ordered接口并没有使用@Order注解。

结论

  • Global过滤器的顺序是由Ordered接口来定义,@Order不起作用。
  • 路由过滤器和Default过滤器的顺序是按照声明的顺序,从1开始递增
  • 所有的Global过滤器、路由过滤器、Default过滤器最终会放到一个集合中按照order大小进行排序
  • 如果order值一样,优先就是Global过滤器>Default过滤器>路由过滤器

ps:以上测试结论基于<spring-cloud.version>Hoxton.SR10</spring-cloud.version>

http://www.yayakq.cn/news/768374/

相关文章:

  • 做单抗药的看什么网站好做网站开发需要什么
  • 免费申请一个网站网页制作软件教程
  • 网站建设网络推广公司win7 iis 默认网站
  • nodejs 网站开发趣头条自媒体平台注册
  • wordpress用虚拟主机还是vps海曙seo关键词优化方案
  • 保定哪有做网站的wordpress建站教程入门
  • seo网站沙盒期vps wordpress ftp
  • 小型企业网站排名前十网站开发及技术路线
  • 网站建设经典文章wordpress页面排序
  • 杨浦网站建设_网站外包wordpress 插件放在那
  • 株洲做网站的手机wap网站html源码
  • 温州英文网站建设app推广的常用方法
  • 东城区网站排名seo凡客诚品官方在哪个网店
  • wordpress站内搜索框定制建站网站建设
  • 全能网站建设完全自学申请网站域名要多少钱
  • 网页设计制作网站开发建设新手建站基础入门到精通视频教程做俄语网站建设
  • 做网站可能遇到的问题制作一个网站需要什么
  • 工具刷网站排刷排名软件广西网络公司有几家
  • 宜昌制作网站公司wordpress 个人资料页
  • 徐州网站推广公司网站源码小千个人网
  • 网站建设添加音乐的代码十大免费软件免费下载
  • 东莞哪家做网站好外网怎么弄
  • 品牌网站设计制作多少钱中小企业网络营销方案
  • 广州网站排名优化费用网站技术建设维护技术论文
  • 天津网站营销威县企业做网站
  • 餐饮商家做网站的好处360社区app
  • 上海网站建设服务市价深圳建设工程交易网站官网
  • 平顶山建站公司在线网站建设哪个正规
  • 充值网站 模板儿童摄影作品网站
  • 大连建站费用制作一款手游需要多少钱