深入解析Spring Cloud Gateway的GlobalFilter

文章目录

  • 摘要
  • 引言
  • GlobalFilter的作用
  • 使用GlobalFilter
    • 默认的GlobalFilter
    • 自定义GlobalFilter
  • 示例代码
  • 配置GlobalFilter
    • 配置文件方式
    • 代码方式
  • 高级用法:重写GlobalFilter
    • 思路
    • 代码实现
  • 结论
    • 参考文献

摘要

本文将详细介绍Spring Cloud Gateway中的GlobalFilter,解释其作用以及如何使用。通过代码示例,读者将深入了解GlobalFilter在Spring Cloud Gateway中的应用,以及如何自定义和配置GlobalFilter来实现定制化的网关逻辑。

引言

Spring Cloud Gateway是Spring Cloud生态系统中的一员,是基于Spring Framework 5、Project Reactor和Spring Boot 2构建的非阻塞网关。GlobalFilter是Spring Cloud Gateway中一个重要的组件,用于在请求经过网关时进行全局的处理操作。本文将详细介绍GlobalFilter的作用和使用方式。

GlobalFilter的作用

GlobalFilter是Spring Cloud Gateway中的全局过滤器,它能够对所有的请求进行拦截和处理。GlobalFilter通常用于实现一些全局的功能,如请求日志记录、请求鉴权、异常处理等。通过GlobalFilter,我们可以在请求经过网关之前或之后进行一系列的操作,以满足特定的需求。

使用GlobalFilter

默认的GlobalFilter

Spring Cloud Gateway默认提供了一些全局过滤器,用于实现一些常见的功能。例如,GlobalFilter接口的实现类ForwardRoutingFilter用于将请求转发到目标服务,AddResponseHeaderFilter用于添加响应头等。通过配置文件或代码的方式,我们可以使用这些默认的GlobalFilter来实现基本的网关功能。

自定义GlobalFilter

除了使用默认的GlobalFilter,我们还可以自定义GlobalFilter来实现定制化的网关逻辑。自定义GlobalFilter需要实现GlobalFilter接口,并重写filter方法。在该方法中,我们可以编写自己的逻辑来处理请求。通过使用自定义GlobalFilter,我们可以实现更加灵活和个性化的网关功能。

示例代码

下面通过示例代码,演示如何使用GlobalFilter来实现请求日志记录的功能。

@Component
public class LoggingFilter implements GlobalFilter, Ordered {private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {logger.info("Request URL: {}", exchange.getRequest().getURI());logger.info("Request Method: {}", exchange.getRequest().getMethod());logger.info("Request Headers: {}", exchange.getRequest().getHeaders());return chain.filter(exchange);}@Overridepublic int getOrder() {return Ordered.HIGHEST_PRECEDENCE;}
}

在上述示例代码中,我们定义了一个名为LoggingFilter的自定义GlobalFilter。在filter方法中,我们通过ServerWebExchange对象获取请求的URL、方法和请求头,并使用日志记录下来。最后,通过调用 chain.filter(exchange) 将请求继续传递给下一个过滤器或目标服务。

为了确保自定义GlobalFilter的执行顺序,我们还需要实现Ordered接口,并重写 getOrder 方法来指定过滤器的执行顺序。在示例代码中,我们使用了 Ordered.HIGHEST_PRECEDENCE 来确保该过滤器是第一个执行的。

配置GlobalFilter

要使用自定义的GlobalFilter,我们需要将其注册到Spring Cloud Gateway中。可以通过配置文件或代码的方式进行注册。

配置文件方式

在application.yml或application.properties文件中添加以下配置:

spring:cloud:gateway:global-filters:- com.example.LoggingFilter

上述配置将LoggingFilter注册为全局过滤器。

代码方式

在Spring Boot的启动类中,使用@Bean注解将LoggingFilter注册为Bean:

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}@Beanpublic LoggingFilter loggingFilter() {return new LoggingFilter();}
}

通过上述配置,我们将LoggingFilter注册为全局过滤器。

高级用法:重写GlobalFilter

在工作中避免不了要自定义starter,以插件的方式引入一些特殊的逻辑,但是同时还要做到用户可拓展。在starter中,可以通过实现GlobalFilter接口来编写全局过滤器。用户在引入starter后,可以通过在自己的应用中重新定义这个过滤器来覆盖starter中的默认实现。

思路

在starter中,可以通过@ConditionalOnMissingBean注解来判断当前应用中是否已经定义了该类型的bean。如果没有定义,则使用starter中的默认实现;如果有定义,则使用应用中的实现。

代码实现

  1. 假设我们在starter中定义了一个名为MyGlobalFilter的全局过滤器:

    public class MyGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 默认实现return chain.filter(exchange);}
    }
    
  2. 我们可以在starter中为这个过滤器添加@ConditionalOnMissingBean注解,以确保只有在应用中没有定义该类型的bean时才会使用默认实现:

    @Configuration
    public class MyConfiguration {@Bean@ConditionalOnMissingBeanpublic GlobalFilter myGlobalFilter() {return new MyGlobalFilter();}
    }
    
  3. 如果用户在自己的应用中想要覆盖这个过滤器的逻辑,只需要定义一个同名的bean即可。例如,用户可以在自己的应用中定义一个名为MyGlobalFilter的bean:

    @Bean
    public GlobalFilter myGlobalFilter() {return (exchange, chain) -> {// 自定义实现return chain.filter(exchange);};
    }
    

这样,在应用启动时,Spring会发现应用中已经有了一个名为MyGlobalFilter的bean,就会使用该实现代替starter中的默认实现。

总结起来,starter中的全局过滤器应该使用 @ConditionalOnMissingBean 注解,以便用户可以在自己的应用中重新定义该过滤器的实现。用户只需要定义一个同名的bean即可覆盖starter中的默认实现。

结论

在本文中,我们详细介绍了Spring Cloud Gateway中的GlobalFilter,并解释了它的作用和使用方式。通过自定义GlobalFilter,我们可以实现定制化的网关逻辑。通过配置文件或代码,我们可以注册和配置GlobalFilter来达到期望的效果。希望本文对读者在使用Spring Cloud Gateway时有所帮助,并能更好地应用于实际项目中。

参考文献

  • Spring Cloud Gateway官方文档
  • Spring Cloud Gateway GitHub仓库

如果大家遇到类似问题,欢迎评论区讨论,如有错误之处,敬请留言。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/103901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VR会议:远程带看功能,专为沉浸式云洽谈而生

随着科技的不断发展&#xff0c;VR技术已经成为当今市场上较为热门的新型技术之一了&#xff0c;而VR会议远程带看功能&#xff0c;更是为用户提供更加真实、自然的沉浸式体验。 随着5G技术的发展&#xff0c;传统的图文、视频这种展示形式已经无法满足消费者对信息真实性的需求…

Vue2 +Element UI 表格行合并

如果相邻数据是一致的&#xff0c;则单元格的行合并,指定需要合并的列&#xff0c;下面我是指定合并了分类和类型这两列。 先看效果 Element UI为我们的<el-table>提供了一个属性span-method&#xff1a;合并行或列的计算方法 下面是一个示例: html部分 - 主要是在表上指…

广州华锐互动:炼钢工厂VR仿真实训系统

随着科技的发展&#xff0c;我们的教育体系和职业培训方法也在迅速变化。其中&#xff0c;虚拟现实&#xff08;VR&#xff09;技术的出现为我们提供了一种全新的学习和培训方式。特别是在需要高度专业技能和安全性的领域&#xff0c;如钢铁冶炼。本文将探讨如何使用VR进行钢铁…

MySQL使用函数、存储过程实现:向数据表快速插入大量测试数据

实现数据表快速插入20W测试数据 实现过程创建表开启允许创建函数生成随机字符串生成随机整数生成随机地址创建存储过程调用存储过程查看插入数据 其他实用函数生成随机浮点数生成随机日期时间生成随机布尔值生成随机姓名生成随机手机号码生成随机邮箱地址生成随机IP地址生成随机…

SQL Server 创建表

切换数据库&#xff0c;判断是否存在 --切换数据库 use DBTEST--判断表是否存在 --创建的所有表都可以在sys.boject中找到&#xff0c;所以这里在sys.objects中查找是否有名字为department的表并且type为U 即用户生成的表 if exists(select * from sys.objects where namedepa…

GraphQL 查询:一个全面指南

GraphQL GraphQL 是一种 API 查询语言和运行时&#xff0c;用于使用现有数据完成这些查询。它为您的 API 中的数据提供了完整且易于理解的描述&#xff0c;让客户能够准确地询问他们需要什么&#xff0c;更容易随着时间的推移发展 API&#xff0c;并启用强大的开发人员工具。 …

TypeScript React(上)

目录 扩展学习资料 TypeScript设计原则 TypeScript基础 语法基础 变量声明 JavaScript声明变量 TypeScript声明变量 示例 接口 (标准类型-Interface) 类型别名-Type 接口 VS 类型别名 类型断言:欺骗TS&#xff0c;肯定数据符合结构 泛型、<大写字母> 扩展学习…

IDEA 配置 云服务器远程部署

目录 参考资料远程部署与远程开发远程连接配置配置成功&#xff1a;同步文件自动更新文件配置自动更新文件参数调整正确运行问题1&#xff1a;运行mvn spring-boot:run之后一直卡在第一条下载问题2&#xff1a;运行成功后访问不到问题3&#xff1a;无法配置远程开发 参考资料 …

4.springcloudalibaba sentinel v1.8.6版本服务搭建

文章目录 前言一、sentinel服务端安装1.1 服务端下载1.2 启动sentinel服务 二、客户端使用sentinel2.1.pom增加sentinel包2.2 增加配置2.3 启动服务 三、验证3.1 给hello接口增加流控规则3.2 测试结果如下 总结 前言 前面完成了gateway项目部署并且测试&#xff0c;现在部署搭…

springboot vue 部署至Rocky(Centos)并自启,本文部署是若依应用

概述 1、安装nohup&#xff08;后台进程运行java&#xff09; 2、安装中文字体&#xff08;防止中文乱码&#xff09; 3、安装chrony&#xff08;保证分布式部署时间的一致性&#xff09; 5、安装mysql数据&#xff0c;迁移目录&#xff0c;并授权自启动&#xff1b; 6、安…

UI自动化测试:Selenium+PO模式+Pytest+Allure整合

本人目前工作中未涉及到WebUI自动化测试&#xff0c;但为了提升自己的技术&#xff0c;多学习一点还是没有坏处的&#xff0c;废话不多说了&#xff0c;目前主流的webUI测试框架应该还是selenium&#xff0c;考虑到可维护性、拓展性、复用性等&#xff0c;我们采用PO模式去写我…

基于Dockerfile搭建LNMP环境

准备工作 #关闭防火墙和防护机制 systemctl stop firewalld systemctl disable firewalld setenforce 0 docker network create --subnet172.18.0.0/16 --opt "com.docker.network.bridge.name""docker1" mynetwork#设置自定义网络模式&#xff0c;模…

力扣:611. 有效三角形的个数

今日为大家分享一道力扣611有效三角形的个数&#xff01;本文将会为大家为大家讲解题目&#xff0c;然后算法思路&#xff0c;最后再进行代码的实现&#xff01;希望看完本文能对读者有一定的收获&#xff01; 一、题目描述 通过题目的描述可以看出&#xff0c;意思是给定一个…

Go If流程控制与快乐路径原则

Go if流程控制与快乐路径原则 文章目录 Go if流程控制与快乐路径原则一、流程控制基本介绍二、if 语句2.1 if 语句介绍2.2 单分支结构的 if 语句形式2.3 Go 的 if 语句的特点2.3.1 分支代码块左大括号与if同行2.3.2 条件表达式不需要括号 三、操作符3.1 逻辑操作符3.2 操作符的…

Linux:redis的基础操作

redis介绍&#xff0c;安装和性能测试 Linux&#xff1a;redis数据库源码包安装-CSDN博客https://blog.csdn.net/w14768855/article/details/133752744?spm1001.2014.3001.5501如果没有了解过redis那么一定要去看看介绍 登录 redis-cli 可以登录到本机127.0.0.1&#xff0c;…

没用的知识增加了,尝试用文心实现褒义词贬义词快速分类

尝试用文心实现褒义词贬义词快速分类 一、我的需求二、项目环境搭建千帆SDK安装及使用流程 三、项目实现过程创建应用获取签名调用接口计算向量积总结 百度世界大会将于10月17日在北京首钢园举办&#xff0c;今天进入倒计时五天了。通过官方渠道的信息了解到&#xff0c;这次是…

Jmeter连接mysql数据库详细步骤

一、一般平常工作中使用jmeter 连接数据库的作用 主要包括&#xff1a; 1、本身对数据库进行测试&#xff08;功能、性能测试&#xff09;时会需要使用jmeter连接数据库 2、功能测试时&#xff0c;测试出来的结果需要和数据库中的数据进行对比是否正确一致。这时候可以通过j…

XML外部实体注入攻击XXE

xml是扩展性标记语言&#xff0c;来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素&#xff0c;一般无法直接打开&#xff0c;可以选择用excl或记事本打…

内存空间的分配与回收之连续分配管理方式

1.连续分配管理方式 连续分配:指为用户进程分配的必须是一个连续的内存空间。 1.单一连续分配 在单一连续分配方式中&#xff0c;内存被分为系统区和用户区。系统区通常位于内存的低地址部分&#xff0c;用于存放操作系统相关数据;用户区用于存放用户进程相关数据。内存中只…

2023年淘宝天猫双11活动时间什么时候开始到几月几号结束?

2023年淘宝天猫双11超级红包领取时间 第一阶段&#xff1a;2023年10月24日20:00 至11月03日23:59 第二阶段&#xff1a;2023年11月04日00:00 至 11月11日23:59 2023年淘宝天猫双11超级红包使用时间 第一阶段&#xff1a;2023年10月31日20:00 至11月03日23:59 第二阶段&…