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

基于YOLOv8的无人机道路损伤检测[四类核心裂缝/坑洼识别]的识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

基于YOLOv8的无人机道路损伤检测[四类核心裂缝/坑洼识别]的识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

基于YOLOv8的无人机道路损伤检测[四类核心裂缝/坑洼识别]的识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用! 源码包含:完整YOLOv8训练代码+数据集(带标注)+权重文件+直接可允许检测的yolo检测程序+直接部署教程/训练教程 源码在文末哔哩哔哩视频简介处获取。 基本功能演示 https://www.bilibili.com/video/BV1H3rFBgESp 项目摘要 本项目基于 YOLOv8 目标检测算法,结合 无人机航拍道路影像数据,构建了一套面向道路养护与巡检场景的多类型道路损伤自动识别系统。系统重点针对四类典型且高风险的路面病害目标进行精准检测与定位,包括:鳄鱼纹裂缝(Alligator Crack)、纵向裂缝(Longitudinal Crack)、**横向裂缝(Transverse Crack)**以及 坑洼(Pothole)。 在模型层面,项目基于 YOLOv8 检测框架完成数据标注规范设计、模型训练与性能调优;

By Ne0inhk

机器人系统软件十年演进

机器人系统软件十年演进(2015-2025):从封闭嵌入式固件到具身智能原生通用体系的全栈革命 2015-2025年,是机器人系统软件从**“硬件绑定的封闭嵌入式固件”向“具身智能原生的端云协同通用软件体系”**彻底重构的十年。作为机器人的“大脑与神经中枢”,系统软件是机器人功能边界、扩展能力、开发效率与智能上限的核心决定因素,其演进始终与机器人本体技术、AI算法、通信技术、云计算技术的发展深度同频,同步完成了从封闭到开放、从单体到分布式、从离线到在线、从固定功能到可自主进化的四次核心跨越。 这十年,机器人系统软件彻底打破了海外巨头数十年的技术垄断与生态封锁,国内产业从完全跟随、依赖开源框架,到自主研发通用机器人操作系统、主导行业标准制定,实现了从技术跟随到全球领跑的历史性逆转。本文与此前机器人核心技术十年演进系列内容形成完整闭环,系统梳理十年间机器人系统软件的四次代际重构、核心维度的本质跃迁、关键技术突破与产业生态变革。 一、核心演进四阶段:与产业发展同频的全栈迭代 机器人系统软件的十年演进,始终沿着**「封闭单体嵌入式固件→模块化分布式松耦合体系→云边端一体化云原生架构→

By Ne0inhk

从零开始学AI绘画:NewBie-image-Exp0.1快速入门指南

从零开始学AI绘画:NewBie-image-Exp0.1快速入门指南 1. 学习目标与前置准备 本文是一篇面向初学者的 AI动漫图像生成技术实战教程,旨在帮助你通过预配置镜像 NewBie-image-Exp0.1 快速上手高质量动漫图像生成。无论你是AI绘画的新手,还是希望研究多角色控制机制的技术爱好者,本文都将提供完整、可执行的操作路径。 学习目标 完成本教程后,你将能够: - 熟练使用 NewBie-image-Exp0.1 镜像进行图像推理 - 掌握基于 XML 结构化提示词的精准角色控制方法 - 修改和运行基础脚本以生成自定义动漫图像 - 理解模型运行环境与显存资源需求 前置知识要求 建议具备以下基础知识以便更好地理解内容: - 基础 Linux 命令行操作能力(如 cd, ls, python 执行) - 对扩散模型(Diffusion Model)有初步了解(非必须) - Python

By Ne0inhk
在FPGA中实现DDS方案详解(频率,幅度,波形可调)

在FPGA中实现DDS方案详解(频率,幅度,波形可调)

目录 1. DDS原理简介 2. 代码实现 2.1 控制模块 2.2 DDS实现模块 2.3 ip核ROM的实现 3. 实验结果 3.1 仿真结果 3.2 实际输出结果 3.2.1波形选择 3.2.2 频率控制: 3.2.3 幅度控制 1. DDS原理简介         DDS技术是从波形相位概念出发,直接对相应的波形数据进行抽样,得到不同的相位,通过DAC转换成模拟波形,最后通过低通滤波器平滑输出所需频率的波形。下图为DDS的示意流程图。 两个重要参数解释:                频率控制字FTW:一般为整数,数值大小控制输出信号的频率大小,数值越大输出信号频率越高,实际输出的信号的频率与频率控制字关系为: 频率控制字 = 脉冲频率 * 2^

By Ne0inhk