过滤器执行顺序

简介: 过滤器执行顺序

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器

问题:当前路由过滤器和DefaultFilter、GlobalFilter 这是三个不同类型的过滤器,如何将其放到一个集合中并排序呢?

实际上 路由过滤器 和 DefaultFilter ,非常接近,只不过一个放在路由器内,一个放在路由器外


上图中的两个AddRequestHeader,他们在java的底层都来源于同一个过滤器工厂,生成的真正过滤器都是GatewayFilter,所以我们认为 路由过滤器 和 DefaultFilter 都是同一种过滤器 GatewayFilter

在网关中,有一个过滤器适配器,如下,其实现了 GatewayFilter 接口,我们开到其内部有个GlobalFiler属性,我们只要将 GlobalFiler 传入,该适配器就能将GlobalFiler 变为GatewayFilter

也就是在网关中,所有的过滤器都会被适配为GatewayFilter,至此就解决了三种过滤器类型不同的问题

问题:如何排序?

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前

GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定

路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增,如下

当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行  


目录
相关文章
|
Arthas 监控 Java
Java 诊断利器 Arthas使用
Java 诊断利器 Arthas使用
5168 0
|
NoSQL Java Redis
Seata常见问题之实现openfeign远程调用失败如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
Seata常见问题之实现openfeign远程调用失败如何解决
|
存储 人工智能 Java
【SpringAIAlibaba新手村系列】(3)ChatModel 与 ChatClient 的深度对比
本章深度解析 Spring AI 中 `ChatModel`(底层接口)与 `ChatClient`(高级封装)的本质区别:前者如“手动挡”,精准控制但需写大量样板代码;后者似“智能点餐机”,链式调用、支持系统提示、模板、工具调用等,开发高效。初学者推荐优先使用 `ChatClient`。
797 0
【SpringAIAlibaba新手村系列】(3)ChatModel 与 ChatClient 的深度对比
|
负载均衡 前端开发 Java
gateway
gateway
239 1
|
监控 Java Nacos
使用Spring Boot集成Nacos
通过上述步骤,Spring Boot应用可以成功集成Nacos,利用Nacos的服务发现和配置管理功能来提升微服务架构的灵活性和可维护性。通过这种集成,开发者可以更高效地管理和部署微服务。
5060 17
|
设计模式 Java 应用服务中间件
多个Filter的执行顺序 | 职责链模式应用
多个Filter的执行顺序 | 职责链模式应用
微信接口报错 "errcode":40163,"errmsg":"code been used, 如何处理?
【10月更文挑战第11天】微信接口报错 "errcode":40163,"errmsg":"code been used, 如何处理?
7917 1
|
存储 容器
Aliyun日志sls接入总结
阿里云接入经验总结
1365 0
|
负载均衡 Java 网络安全
gateway基本配置
gateway基本配置
3706 4
|
关系型数据库 数据库 数据安全/隐私保护
springboot+dynamic-datasource多数据源配置动态切换
springboot+dynamic-datasource多数据源配置动态切换
6141 0