世界热门:Spring Cloud Gateway过滤器的执行顺序

来源:腾讯云

2023-04-12 08:07:36

在Spring Cloud Gateway中,过滤器的执行顺序对于实现请求处理流程的正确性和效率至关重要。Spring Cloud Gateway中的过滤器分为全局过滤器和局部过滤器两种类型,不同类型的过滤器在执行顺序上有所不同。

全局过滤器执行顺序


(资料图片)

全局过滤器是指在所有路由规则中都会执行的过滤器,可以用于实现一些全局性的功能,如请求的日志记录、响应头信息的设置等。Spring Cloud Gateway提供了一些内置的全局过滤器,如请求路径的重写、请求日志的记录等。在Spring Cloud Gateway中,全局过滤器的执行顺序是由GatewayFilterAdapter的ORDER常量值确定的,该常量值为-2147483648,表示全局过滤器将在所有的局部过滤器之前执行。

局部过滤器执行顺序

局部过滤器是指只在特定路由规则中才会执行的过滤器,可以用于实现一些特定的功能,如请求鉴权、请求转发等。Spring Cloud Gateway中的局部过滤器可以通过自定义过滤器工厂类来实现,该工厂类需要继承AbstractGatewayFilterFactory抽象类,并实现其中的apply方法和泛型参数指定配置类。在Spring Cloud Gateway中,局部过滤器的执行顺序是由配置文件中的filters属性确定的,该属性可以通过spring.cloud.gateway.routes.filters参数进行配置,不同的过滤器在列表中的位置就决定了它们的执行顺序。

以下是一个示例,其中定义了一个全局过滤器和两个局部过滤器,演示了不同类型过滤器的执行顺序:

@Componentpublic class GlobalFilter implements GatewayFilter, Ordered {    @Override    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {        System.out.println("GlobalFilter before...");        return chain.filter(exchange).then(Mono.fromRunnable(() -> {            System.out.println("GlobalFilter after...");        }));    }    @Override    public int getOrder() {        return -1;    }}@Componentpublic class LocalFilter1 extends AbstractGatewayFilterFactory {    public LocalFilter1() {        super(Config.class);    }    @Override    public GatewayFilter apply(Config config) {        return (exchange, chain) -> {            System.out.println("LocalFilter1 before...");            return chain.filter(exchange).then(Mono.fromRunnable(() -> {                System.out.println("LocalFilter1 after...");            }));        };    }    public static class Config {        // 配置参数    }}@Componentpublic class LocalFilter2 extends AbstractGatewayFilterFactory {    public LocalFilter2() {        super(Config.class);    }    @Override    public GatewayFilter apply(Config config) {        return (exchange, chain) -> {            System.out.println("LocalFilter2 before...");            return chain.filter(exchange).then(Mono.fromRunnable(() -> {                System.out.println("LocalFilter2 after...");            }));        };    }    public static class Config {        // 配置参数    }}

在这个示例中,我们定义了一个全局过滤器GlobalFilter和两个局部过滤器LocalFilter1和LocalFilter2。其中,GlobalFilter实现了GatewayFilter和Ordered接口,用于实现全局过滤器的逻辑。LocalFilter1和LocalFilter2都继承了AbstractGatewayFilterFactory抽象类,并通过实现apply方法实现了局部过滤器的逻辑。在apply方法中,我们可以实现自己的过滤逻辑,并返回一个GatewayFilter对象。在GatewayFilter对象中,我们可以继续调用chain.filter方法来执行下一个过滤器,或者直接返回结果。这里我们使用Mono.fromRunnable方法来在请求结束时输出一些信息。

在上述示例中,我们定义了全局过滤器和两个局部过滤器。在执行顺序方面,由于全局过滤器的ORDER常量值最小,因此它会在所有的局部过滤器之前执行。而在局部过滤器的执行顺序方面,它们的执行顺序是由配置文件中的filters属性决定的,如下所示:

spring:  cloud:    gateway:      routes:      - id: example        uri: http://example.org        predicates:        - Path=/example/**        filters:        - LocalFilter2        - LocalFilter1

在这个配置文件中,我们为example路由规则指定了两个局部过滤器,分别是LocalFilter2和LocalFilter1。在执行顺序方面,LocalFilter2将会先于LocalFilter1执行,因为它们在filters列表中的位置是从前往后的。也就是说,请求先经过LocalFilter2,再经过LocalFilter1,最后再到达后端服务。

需要注意的是,在GatewayFilterChain中的filter方法调用中,如果其中一个过滤器返回了错误,那么整个请求处理过程会立即停止并返回错误。因此,在设计过滤器时需要格外小心,确保每个过滤器都不会抛出异常,以免影响整个系统的稳定性。

此外,还有一些其他的过滤器类型,如:

Pre Filter:在请求被路由之前调用。可以用来实现身份认证、IP过滤等逻辑。Post Filter:在请求被路由之后调用。可以用来实现响应头处理、日志记录等逻辑。Error Filter:在请求处理过程中发生错误时调用。可以用来实现异常处理、错误日志记录等逻辑。

这些过滤器类型可以通过实现不同的接口来实现。例如,实现Ordered和GatewayFilter接口的就是Pre Filter和Global Filter类型的过滤器。而实现Ordered和WebFilter接口的则是Error Filter类型的过滤器。

关键词:

世界热门:Spring Cloud Gateway过滤器的执行顺序

在SpringCloudGateway中,过滤器的执行顺序对于实现请求处理流程的正确性和效率至关重要。SpringCloudGateway中的过滤器分为[详细]
2023-04-12

今日最新!华泰柏瑞8只基金一季度跌逾10% 重仓新能源与消费

华泰柏瑞8只基金一季度跌逾10%重仓新能源与消费[详细]
2023-04-12

天天消息!曼城vs拜仁全场数据:控球率44%-56%,射门17-12,射正9-4

北京时间4月12日凌晨,欧冠1 4决赛首回合,曼城3-0击败拜仁。本场比赛,控球率为44%-56%,射正数9-4,丢失球权次数116-122。曼城vs拜仁全场数[详细]
2023-04-12

环球实时:4月10日基金净值:前海联合泳隽混合A最新净值1.9095,跌0.63%

4月10日,前海联合泳隽混合A最新单位净值为1 9095元,累计净值为1 9895元,较前一交易日下跌0 63%。历史数据显示该基金近1个月上涨7 25%,近3[详细]
2023-04-12

天天快资讯丨第二届西安·贞观脊柱微创技术暨Workshop假骨操作培训班举办

4月8日,第二届西安·贞观脊柱微创技术暨Workshop假骨操作培训班在陕西西安举办。培训班由中国康复医学会骨伤康复专业委员会主办,西北大学附[详细]
2023-04-11

新动态:互动| 科大讯飞:将于5月6日发布讯飞预训练大模型的详细信息

科大讯飞在互动平台表示,讯飞依托认知智能全国重点实验室(科技部首批20家标杆全国重点实验室之一)的长期积累,于2022年12月份启动生成式预[详细]
2023-04-11

全球微动态丨【民生在线】一批重大科技项目在青落地 以科技创新赋能实体经济高质量发展

青岛新闻网4月11日讯(记者张晓楠)今天下午,青岛市科学技术局党组成员、副局长刘学辉做客网谈直播间,围绕“以科技创新赋能实体经济高质量发[详细]
2023-04-11

焦点要闻:龙虎榜丨兴发集团今日跌8.98%,三机构净卖出2.52亿元

4月11日,兴发集团今日跌8 98%,成交额15 69亿元,换手率5 25%,盘后龙虎榜数据显示,沪股通专用席位买入39[详细]
2023-04-11

【天天时快讯】住建部改发司调研当阳老旧小区改造

住建部改发司调研当阳老旧小区改造---湖北日报客户端讯(通讯员谭昊)4月8日,住建部改发司三级调研员余猛一行调研我市城镇老旧小区改造工作。[详细]
2023-04-11

微资讯!贵州黔东南味预制菜破层出圈

  “凯里酸汤粉,太酸爽了。”“请永远相信贵州的酸汤粉。”“贵州凯里酸汤粉,真的太太太好吃了。”4月9日,记者随手打开一个短视频平台,[详细]
2023-04-11
版权所有: 纵横制冷网 All Rights Reserved
浙ICP备2022016517号-12
联系邮箱:51 46 76 11 3 @qq.com