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方法,该方法前面已经介绍过了。

相关文章
|
Java Spring
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
1455 0
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
这篇文章介绍了如何使用Ant Design Vue UI框架创建一个简单的后台管理模板,包括创建Vue项目、安装和使用ant-design-vue、以及编写后台管理通用页面的代码和样式。
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
|
数据采集 JavaScript 前端开发
使用Go和JavaScript爬取股吧动态信息的完整指南
本文介绍了如何使用Go和JavaScript构建网络爬虫,从股吧网站抓取实时股市信息。通过设置代理服务器以应对反爬策略,利用`got`库执行JavaScript提取动态数据,如用户讨论和市场分析。示例代码展示了爬虫的实现过程,包括浏览器实例创建、代理配置、JavaScript执行及数据打印。此方法有助于投资者及时获取市场资讯,为决策提供支持。
368 4
使用Go和JavaScript爬取股吧动态信息的完整指南
|
消息中间件 缓存 前端开发
评论系统如何不崩溃?揭开海量评论背后的技术秘密
小米介绍了一种高效处理海量新闻评论的技术方案。面对突发新闻带来的评论潮,通过采用消息队列异步入库、读写分离以及热点缓存等技术,不仅能有效减轻数据库压力,还能保证用户快速查看最新评论。消息队列如Kafka或RabbitMQ可缓存评论请求,后台异步处理入库,避免数据库过载。读写分离则通过主从数据库架构分散读取负载,配合热点评论的缓存机制进一步提升访问速度。这套架构确保了系统的稳定性和响应速度,适用于高并发的评论处理场景。
221 0
|
并行计算 PyTorch 算法框架/工具
LLM推理引擎怎么选?TensorRT vs vLLM vs LMDeploy vs MLC-LLM
有很多个框架和包可以优化LLM推理和服务,所以在本文中我将整理一些常用的推理引擎并进行比较。
1747 2
logback配置,命名为logback-spring.xml
logback配置,命名为logback-spring.xml
|
小程序 数据库
一分钟教你学会小程序云开发的数据库的增删改查
本文简要介绍了小程序云开发中数据库的增删改查操作。首先展示了查询代码,通过`wx.cloud.database().collection().get()`获取数据;接着演示添加数据,强调数据字段需与数据库匹配;然后说明删除数据需基于_id,通过`doc(id).remove()`执行;最后,更新数据同样依赖_id,使用`doc(id).update()`进行修改。
417 1
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的网上商城系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的网上商城系统附带文章源码部署视频讲解等
156 1
|
负载均衡 监控 Java
Sentinel介绍与使用
Sentinel介绍与使用
806 3
|
编解码 监控 NoSQL
告别复杂操作:体验Tiny RDM,下一代Redis GUI神器登场!
告别复杂操作:体验Tiny RDM,下一代Redis GUI神器登场!
1687 1