Spring Cloud之服务入口Gateway之自定义过滤器

Spring Cloud之服务入口Gateway之自定义过滤器

目录

过滤器执行顺序

自定义过滤器

自定义GatewayFilter

定义GatewayFilter

配置过滤器

启动服务并访问

自定义GlobalFilter

定义GlobalFilter

启动服务并访问

服务部署


过滤器执行顺序

如果⼀个项⽬中, 既有GatewayFilter, ⼜有 GlobalFilter时, 执⾏的先后顺序是什么呢?

请求路由后, ⽹关会把当前项⽬中的GatewayFilter和GlobalFilter合并到⼀个过滤器链(集合)中, 并进⾏排序, 依次执⾏过滤器.

每⼀个过滤器都必须指定⼀个int类型的order值, 默认值为0, 表⽰该过滤的优先级. order值越⼩,优先级越⾼,执⾏顺序越靠前.

• Filter通过实现Order接⼝或者添加@Order注解来指定order值.
• Spring Cloud Gateway提供的Filter由Spring指定. ⽤⼾也可以⾃定义Filter, 由⽤⼾指定.
• 当过滤器的order值⼀样时, 会按照 defaultFilter > GatewayFilter > GlobalFilter的顺序执⾏.

自定义过滤器

Spring Cloud Gateway提供了过滤器的扩展功能, 开发者可以根据实际业务来⾃定义过滤器, 同样⾃定义过滤器也⽀持GatewayFilter 和 GlobalFilter两种.

自定义GatewayFilter

⾃定义GatewayFilter, 需要去实现对应的接⼝ GatewayFilterFactory , Spring Boot 默认帮我们
实现的抽象类是 AbstractGatewayFilterFactory , 我们可以直接使⽤.

定义GatewayFilter
package gateway; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Slf4j @Component public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomConfig> implements Ordered { public CustomGatewayFilterFactory() { super(CustomConfig.class); } @Override public GatewayFilter apply(CustomConfig config) { return new GatewayFilter() { /** * ServerWebExchange: HTTP 请求-响应交互契约, 提供了对HTTP请求和响应的访问 * GatewayFilterChain: 过滤器链 * Mono: Reactor的核心类, 数据流发布者,Mono最多只能触发一个事件.可以把Mono用在异步完成任务时,发出通知 * chain.filter(exchange) 执行请求 * Mono.fromRunnable() 创建一个包含Runnable元素的数据流 */ @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { //Pre类型 执行请求 Post类型 log.info("Pre Filter, config:{} ",config); //Pre类型过滤器代码逻辑 return chain.filter(exchange).then(Mono.fromRunnable(()->{ log.info("Post Filter...."); //Post类型过滤器代码逻辑 })); } }; } @Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE; } }

针对这个Filter的配置, 使⽤CustomConfig 定义

package gateway; import lombok.Data; @Data public class CustomConfig { private String name; }

代码说明

1. 类名统⼀以GatewayFilterFactory结尾, 因为默认情况下, 过滤器的name会采⽤该定义类的前缀. 这⾥的name=Custom(yml配置中使⽤)
2. apply⽅法中, 同时包含Pre和Post过滤, then⽅法中是请求执⾏结束之后处理的
3. CustomConfig 是⼀个配置类, 该类只有⼀个属性name, 和yml的配置对应
4. 该类需要交给Spring管理, 所以需要加 @Service 注解
5. getOrder表⽰该过滤器的优先级, 值越⼤, 优先级越低
配置过滤器
spring: cloud: gateway: routes: - id: order-service #路由规则id, 随便起, 不重复即可 uri: lb://order-service/ #目标服务地址 predicates: #路由条件 - Path=/order/**,/feign/** filters: - AddRequestParameter=userName, xiaoming - name: Custom #过滤器名称 args: name: test_custom
启动服务并访问
自定义GlobalFilter

GlobalFilter的实现⽐较简单, 它不需要额外的配置, 只需要实现GlobalFilter接⼝, ⾃动会过滤所有的Filter.

定义GlobalFilter
package gateway; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Slf4j @Component public class CustomGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("Pre Global Filter"); return chain.filter(exchange).then(Mono.fromRunnable(()->{ log.info("Post Global Filter..."); })); } @Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE; } }
启动服务并访问

从日志中可以看出,当GatewayFilter和GlobalFilter过滤器的order一样时,会先执行GatewayFilter,然后再执行GlobalFilter。其中会先执行 Pre GatewayFilter,然后执行 Pre GlobalFilter,然后执行 Post GlobalFilter,最后执行 Post GatewayFilter。

服务部署

1. 修改数据库, Nacos等相关配置
2. 对三个服务进⾏打包: product-service, order-service, gateway
3. 上传jar到Linux服务器
4. 启动Nacos
启动前最好把data数据删除掉.
5. 启动服务

#后台启动order-service, 并设置输出⽇志到logs/order.log
nohup java -jar order-service.jar >logs/order.log &


#后台启动product-service, 并设置输出⽇志到logs/order.log
nohup java -jar product-service.jar >logs/product-9090.log &


#启动⽹关
nohup java -jar gateway.jar >logs/gateway.log &

观察日志:

Read more

Python 流程控制完全指南:条件语句 + 循环语句 + 实战案例(零基础入门)

Python 流程控制完全指南:条件语句 + 循环语句 + 实战案例(零基础入门)

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 顺序语句:基础执行语句 * 二. 条件语句:实现 “如果… 否则…” 逻辑 * 2.1 核心语法格式 * 2.2 关键注意点 * 2.3 空语句 pass:占位符作用 * 2.4 练习题 * 三. 循环语句:实现 “重复执行” 逻辑 * 3.1 while 循环:条件满足就一直执行 * 3.2 for 循环:

By Ne0inhk
Python 入门超详细指南:环境搭建 + 核心优势 + 应用场景(零基础友好)

Python 入门超详细指南:环境搭建 + 核心优势 + 应用场景(零基础友好)

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 先搞懂:计算机与编程的核心概念 * 1.1 什么是计算机? * 1.2 什么是编程? * 二. 认识 Python:起源、优势与应用场景 * 2.1 Python 的 “前世今生” * 2.2 Python 的优缺点以及应用场景大盘点 * 三. Python 的就业前景:理性看待 “钱景” * 四. 环境搭建:Python+PyCharm(一步到位) * 4.1 安装 Python

By Ne0inhk
【3月考】二级Python最新真题及满分代码合集(简单应用题部分)

【3月考】二级Python最新真题及满分代码合集(简单应用题部分)

本套试题内容适配2026年3月考试 文本结尾提供所有题目配套电子版及素材和答案 祝大家优秀拿下!!! 第1套题 【题目素材】 # 以下代码为提示框架# 请在...处使用一行或多行代码替换# 请在______处使用一行代码替换## 注意:提示框架代码可以任意修改,以完成程序功能为准 txt =input("请输入类型序列: ")... d ={}... ls =list(d.items()) ls.sort(key=lambda x:x[1], reverse=True)# 按照数量排序for k in ls:print("{}:{}".format(k[0], k[1])) 【参考代码】 # 以下代码为提示框架# 请在...处使用一行或多行代码替换# 请在______处使用一行代码替换#

By Ne0inhk
python+机器学习基于肺癌数据分析可视化与预测系统

python+机器学习基于肺癌数据分析可视化与预测系统

收藏关注不迷路!! 🌟文末获取源码+数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 文章目录 * 详细视频演示 * 项目介绍 * 系统效果图 * 源码获取 详细视频演示 文章底部名片,联系我看更详细的演示视频 项目介绍 Python+机器学习肺癌数据分析可视化与预测系统介绍 一、系统概述 该系统以Python为核心开发语言,结合机器学习技术,针对肺癌数据构建了集数据预处理、特征工程、模型训练、评估优化及可视化展示于一体的完整解决方案。系统支持从医院电子病历、医学影像数据库、临床试验数据及公开医学数据集等多源采集数据,涵盖患者基本信息、临床症状、影像学特征、病理检查结果及治疗预后信息等。通过深度挖掘数据价值,系统旨在辅助医疗决策、疾病诊断及治疗效果评估,为肺癌的早期筛查、个性化治疗及预防提供科学依据。 二、系统功能模块 数据采集与预处理 数据采集:系统支持从多种数据源采集肺癌相关数据,确保数据的多样性和全面性。 数据清洗:处理缺失值、异常值和重复数据,采用

By Ne0inhk