焦点日报:Spring Cloud Gateway过滤器的执行顺序
在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过滤器的执行顺序
-
QQ邮箱“关联邮箱帐号”功能将下线
-
每日速读!又要下雨了!冷空气来“搞事”,明日起广东将有强对流天气
-
众安保险价格表查询?含医疗险、重疾险、意外险产品保费
-
第一季度有哪些书更受读者青睐?影视剧带热图书,心理自助图书走红
-
天天时讯:打造“世界显示之都”,广州为什么行?
-
国产新车品鉴:2018北京车展:领克01 PHEV正式亮相_全球要闻
-
环球资讯:南昌将新增一所学校!位置公布
-
这是梅西加盟大巴黎后首次回到巴塞罗那
-
学校软文:如何用好互联网软文推广提升品牌知名度
-
天天微速讯:穆雷:训练结束后我感觉右手拇指有点酸痛 马龙:这可不好!
-
第三届中国国际消费品博览会吸引观众
-
你的味道我知道gl大西洋暖流 你的味道我知道-天天要闻
-
fat32和ntfs的区别是什么_fat32和ntfs的区别
-
环球热点!巴西总统卢拉抵达上海
-
Spring Cloud Gateway负载均衡-加权随机策略 全球快资讯
-
落叶归根那我归你(关于落叶归根那我归你的简介) 天天看热讯
-
请永远相信“相信”的力量-今日热闻
-
独家|监管对私募产品投资城投债进行规范:超过一定条件后,需先压降才能新增备案
-
90所大学撤销公共事业管理专业,76所大学撤销服装与服饰设计专业
-
2023年漯河市医学会口腔专业分会年会暨种植新技术交流会召开 世界速读
-
全球报道:我的世界1.7.10死亡不掉落指令_我的世界1 7 10死亡不掉落指令
-
每日信息:2023年4月12日山西省莲藕批发价格行情
-
快资讯丨简爱故事情节梗概_简爱故事情节
-
平安消费金融成功募集两年期银团贷款
-
Sci Adv:一种新型的药物组合或有望帮助减少机体非小细胞肺癌的进展
-
旅游业迎近年来最火热“五一”:多地酒店民宿提前售罄,出境跟团游满员待发
-
世界要闻:西藏江孜:致富路上青稞飘香
-
锋无力导致体系崩塌,拜仁输球不是于帕一个人的锅 即时看
-
华帝股份:4月11日获融资买入665.51万元,占当日流入资金比例12.19% 每日速读
-
医疗反腐剑指利益输送“新马甲”
-
3月房企非银融资917.9亿元 环比增加逾1倍-环球资讯
-
4月11日基金净值:申万菱信新动力混合最新净值0.5607,涨0.95% 当前速递
-
观天下!高仪花洒怎么样,效果真实评测
-
时政微视频丨瞰广东|简讯