在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过滤器的执行顺序|全球新资讯
名爵6自动经典版上市,绝对是男孩子的最爱-全球观点
山能鲁西矿业鲁西煤矿顺利通过国家一级安全生产标准化现场审查
周慧敏离婚风波升级!曝女方筹谋29年,10亿财产倪震一分钱拿不到 环球最资讯
安踏体育:2023年第一季度FILA品牌产品零售金额与2022年同期相比录得高单位数的正增长|天天观热点
郑州市自然资源和规划局经开分局:召开优化营商环境暨服务企业百日行动动员部署会
水刺无纺布的原理特点_压缩面膜材质中 rdquo 水刺无纺布 ldquo 是什么意思
2023年4月12日山西省西葫芦批发价格行情 全球热头条
天天热推荐:nba季后赛历年对阵图_nba季后赛历史助攻榜
天天观焦点:借钱三巨头:360借钱、度小满、钱小乐凭何立足?
Nature:从结构上揭示线粒体呼吸链超级复合物的组装机制
一季度新增人民币贷款同比创新高,央行这份报告释放了什么信号?
【全球聚看点】西藏金融机构助力旅游经济优质复苏
世界通讯!欧冠曼城为什么三球战胜拜仁占得先机?球迷掏心窝,说出心里话
凯旺科技:4月11日获融资买入114.93万元-滚动
生成式人工智能产品 提供服务前需申报评估-焦点快看
婚介平台“塌房”
4月11日基金净值:东方红配置精选混合A最新净值1.4204,涨0.32%_环球精选
汉王N10手写电纸本怎么样,效果真实评测
小学生在校表现情况_大学生在校表现情况
平安保险官网首页官网_平a_全球头条
天津:“投资热土”聚集效应初显
环球滚动:沙尘天气将抵南京,注意防范!
安徽:宿州淮北两地住房公积金实现互认互贷 环球简讯
2023年4月11日山东省一甲胺价格最新行情预测
素食食品行业市场多大?素食食品市场现状及前景分析2023
网易回应“苏炳添起诉侵权”:已删除未经授权肖像照片|全球看热讯
聚焦绿色低碳,七匹狼坚定踏上可持续发展之路
恒源煤电:根据上市公司信息披露相关准则,公司会在定期报告中披露报告期末股东人数等信息-当前关注
中信建投期货4月11日铅锌报告:美元指数反弹 铅锌窄幅波动_天天新视野
投资者们如何补课全面注册制
全网最详细中英文ChatGPT-GPT-4示例文档-步骤指示智能生成从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)|世界快报
环球微速讯:上蔡县举行共谋家乡发展恳谈会
环球新动态:澳门特区政府卫生局:正加大对帕金森病早期预防、诊断和治疗的投入
“法官违纪后仍审案”,法院通报 全球热文
游戏女名字优雅大方_游戏女名字
相关新闻