zuul如果两个filter的order一样,是如何排序的?(下)

简介: zuul如果两个filter的order一样,是如何排序的?(下)

正文


如果filterOrder一样如何排序?


我们看看Integercompare方法具体的逻辑

4.png

如果x==y,则返回0,x

5.png

看到这里,我们得出这样的结论,如果filterOrder一样,则Collections.sort(list);排序时不交换位置,这按照ZuulFilter默认加载顺序。那么,ZuulFilter的默认加载顺序是怎么样的?

7.png

它是通过getAllFilters方法获取ZuulFilter集合,该方法其实返回的是名称为filtersConcurrentHashMapvalues,即返回Set集合,是无序的。


  • 重要的事情说三遍:如果filterOrder一样,ZuulFilter是无序的。
  • 重要的事情说三遍:如果filterOrder一样,ZuulFilter是无序的。
  • 重要的事情说三遍:如果filterOrder一样,ZuulFilter是无序的。

所以,filterOrder切记不要定义相同的,不然可能会出现无法预知的执行结果。


两种排序方法


自定义排序其实有两种方法:

  • 实现Comparable接口,重写compareTo方法,
  • 实现Comparator接口,重写compare方法如果要使用Collections.sort(list);排序,它默认用的是第一种方法,上面的filterOrder之所以可以排序,是因为Integer实现了Comparable接口,重写了compareTo方法


6.png


如果想自己定义排序规则可以通过实现Comparator接口,重写compare方法。


Collections.sort(list,new Comparator<Integer>(){
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
});


它的底层也是通过二分查找实现的

8.png


那么这两种方法有什么区别呢?


  • Comparable接口位于java.lang包下,而Comparator接口位于java.util包下。
  • Comparable接口是内部比较器,一个类如果想要使用Collections.sort(list) 方法进行排序,则需要实现该接口
  • Comparator接口是外部比较器用于对那些没有实现Comparable接口或者对已经实现的Comparable中的排序规则不满意进行排序.无需改变类的结构,更加灵活。


彩蛋


zuul中是通过filterOrder参数的大小排序的,而在spring中是通过@Order注解排序的。

3.png

默认情况下,如果不指定value值,则value是Integer的最大值。

由于排序规则是value越小,则排在越靠前,所以如果不指定value值,则它排在最后。

2.png

spring是通过OrderComparator类排序的,它实现了Comparator接口,它的doCompare方法实现的排序。

1.png

最终也是调用Integer类的compare方法,该方法前面已经介绍过了。

相关文章
|
数据采集 JavaScript 前端开发
使用Go和JavaScript爬取股吧动态信息的完整指南
本文介绍了如何使用Go和JavaScript构建网络爬虫,从股吧网站抓取实时股市信息。通过设置代理服务器以应对反爬策略,利用`got`库执行JavaScript提取动态数据,如用户讨论和市场分析。示例代码展示了爬虫的实现过程,包括浏览器实例创建、代理配置、JavaScript执行及数据打印。此方法有助于投资者及时获取市场资讯,为决策提供支持。
512 4
使用Go和JavaScript爬取股吧动态信息的完整指南
|
消息中间件 缓存 前端开发
评论系统如何不崩溃?揭开海量评论背后的技术秘密
小米介绍了一种高效处理海量新闻评论的技术方案。面对突发新闻带来的评论潮,通过采用消息队列异步入库、读写分离以及热点缓存等技术,不仅能有效减轻数据库压力,还能保证用户快速查看最新评论。消息队列如Kafka或RabbitMQ可缓存评论请求,后台异步处理入库,避免数据库过载。读写分离则通过主从数据库架构分散读取负载,配合热点评论的缓存机制进一步提升访问速度。这套架构确保了系统的稳定性和响应速度,适用于高并发的评论处理场景。
284 0
|
小程序 数据库
一分钟教你学会小程序云开发的数据库的增删改查
本文简要介绍了小程序云开发中数据库的增删改查操作。首先展示了查询代码,通过`wx.cloud.database().collection().get()`获取数据;接着演示添加数据,强调数据字段需与数据库匹配;然后说明删除数据需基于_id,通过`doc(id).remove()`执行;最后,更新数据同样依赖_id,使用`doc(id).update()`进行修改。
514 1
|
消息中间件 负载均衡 搜索推荐
交易系统架构
交易系统的业务域是什么?即交易系统应该负责那些内容。 面对多样性的业务场景,交易系统如何承接他们?即交易系统的业务扩展性如何保证。 交易系统的复杂性问题,以及如何处理,特别是业务、系统解耦问题。 事件驱动流程。 简述高并发与高可用技术。
11411 1
|
开发框架 安全 JavaScript
网络安全-文件上传漏洞的原理、攻击与防御
网络安全-文件上传漏洞的原理、攻击与防御
1013 0
网络安全-文件上传漏洞的原理、攻击与防御
|
BI 索引 Python
python中使用xlrd、xlwt操作excel表格详解
python中使用xlrd、xlwt操作excel表格详解
159 0
|
4天前
|
云安全 监控 安全
|
2天前
|
存储 机器学习/深度学习 人工智能
打破硬件壁垒!煎饺App:强悍AI语音工具,为何是豆包AI手机平替?
直接上干货!3000 字以上长文,细节拉满,把核心功能、使用技巧和实测结论全给大家摆明白,读完你就知道这款 “安卓机通用 AI 语音工具"——煎饺App它为何能打破硬件壁垒?它接下来,咱们就深度拆解煎饺 App—— 先给大家扒清楚它的使用逻辑,附上“操作演示”和“🚀快速上手不踩坑 : 4 条核心操作干货(必看)”,跟着走零基础也能快速上手;后续再用真实实测数据,正面硬刚煎饺 App的语音助手口令效果——创建京东「牛奶自动下单神器」口令 ,从修改口令、识别准确率到场景实用性,逐一测试不掺水,最后,再和豆包 AI 手机语音助手的普通版——豆包App对比测试下,简单地谈谈煎饺App的能力边界在哪?