gateway之过滤器(Filter)详解

2023-09-22 11:50:17

什么是过滤器

在Spring Cloud中,过滤器(Filter)是一种关键的组件,用于在微服务架构中处理和转换传入请求以及传出响应。过滤器位于服务网关或代理中,并通过拦截请求和响应流量来提供各种功能。

过滤器在请求的不同生命周期阶段执行特定的操作,例如鉴权、认证、请求转发、限流、日志记录等。它们可以在服务调用链中的不同位置进行配置和应用,以实现各种需求和业务规则。

Spring Cloud Gateway和Zuul是两个常用的Spring Cloud组件,提供了内置的过滤器机制。

Spring Cloud Gateway使用GatewayFilter来定义过滤器。GatewayFilter可以在请求进入网关时、在路由转发之前或之后,以及在响应返回给客户端之前或之后执行操作。它们提供了丰富的功能和扩展性,如鉴权、限流、重试、请求转发、修改请求/响应等。

Zuul使用Zuul Filter来实现过滤器功能。Zuul Filter分为四种类型:pre、route、post和error。pre过滤器在请求被路由之前执行,可用于鉴权、请求限制等操作;route过滤器用于将请求路由到具体的服务实例;post过滤器在请求已经被路由到目标服务并得到响应后执行,可进行响应的日志记录、统计信息收集等操作;error过滤器处理在整个请求生命周期中发生的错误。

通过编写和配置过滤器,我们可以根据特定需求对请求和响应进行操作,从而实现强大的功能和逻辑。过滤器能够提高安全性、稳定性和可维护性,并且与Spring Cloud的其他组件集成,使得微服务架构更加灵活和可扩展。

过滤器的种类

在Spring Cloud中,过滤器(Filter)根据其作用和所处的阶段,可以分为以下几种类型:

全局过滤器(Global Filters):全局过滤器是应用于所有进入服务网关或代理的请求和响应的过滤器。它们可以执行跨服务的通用功能,如鉴权、请求日志记录、性能监控等。全局过滤器对整个微服务架构起到了全局影响,因此需要谨慎使用。

前置过滤器(Pre Filters):前置过滤器在路由转发之前执行。它们可以处理请求的验证、鉴权、参数校验等操作。前置过滤器可以拦截请求并进行必要的修改,例如添加头信息、修改请求路径等。通过前置过滤器,我们可以在请求进入系统之前对其进行预处理。

路由过滤器(Route Filters):路由过滤器在请求被路由到目标服务实例之前执行。它们可以修改请求的URL、请求头、请求体等,并决定请求应该被路由到哪个服务实例。通过路由过滤器,我们可以实现动态路由、负载均衡等功能。

后置过滤器(Post Filters):后置过滤器在请求已经被路由到目标服务实例并得到响应后执行。它们可以对响应进行处理,例如日志记录、结果转换、添加响应头等。后置过滤器常用于统一处理响应,确保响应符合统一的格式和标准。

错误过滤器(Error Filters):错误过滤器用于处理在请求生命周期中发生的错误。它们可以捕获异常、记录错误信息,并提供适当的响应给客户端。错误过滤器可以增强系统的健壮性,使其能够更好地处理异常情况。

除全局过滤器外,其他均属于局部过滤器

局部过滤器

局部过滤器(Local Filters)指的是应用于特定路由或服务实例的过滤器。它们可以针对某个具体的路由进行处理,并只对该路由的请求和响应生效。后置过滤器是局部过滤器的一种形式,它在请求被路由到目标服务实例并得到响应后执行。

通过定义后置过滤器,您可以对从后端服务返回的响应进行处理和修改。例如,您可以在后置过滤器中添加响应头、记录日志、转换响应结果等操作。后置过滤器提供了一个在请求生命周期的最后阶段对响应进行加工的机会。

代码示例

以下是一个路由过滤器的例子

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;

@Component
public class CustomRouteFilter extends AbstractGatewayFilterFactory<CustomRouteFilter.Config> {

    public CustomRouteFilter() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            // 在路由请求之前执行的操作
            System.out.println("执行路由过滤器");
            // 可以根据需要对请求进行修改、验证等操作

            return chain.filter(exchange);
        };
    }

    public static class Config {
        // 配置参数(可选)
    }

}

在上述示例中,我们创建了一个名为CustomRouteFilter的类,并继承了AbstractGatewayFilterFactory。同样,Config是用于配置参数的类,根据需要进行自定义。

然后,我们重写了apply方法,并在其中编写了自定义的路由过滤器逻辑。在这个示例中,我们简单地打印了一条消息,表示路由过滤器被执行。

通过将此自定义路由过滤器添加到Spring Cloud Gateway的路由配置中,它将在路由请求之前执行特定逻辑。您还可以根据需要对请求进行修改、验证等操作。

全局过滤器

全局过滤器是应用于所有进入服务网关或代理的请求和响应的过滤器。它们可以执行跨服务的通用功能,如鉴权、请求日志记录、性能监控等。全局过滤器对整个微服务架构起到了全局影响,因此需要谨慎使用。

代码示例

在全局过滤器中,过滤的类需要去实现GlobalFilter 接口。

@Component
public class LogFilter implements GlobalFilter {
    Logger log=  LoggerFactory.getLogger(this.getClass());
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info(exchange.getRequest().getPath().value());
        return chain.filter(exchange);
    }
}

此代码为记录日志的全局过滤器,当执行时,会在控制台记录其对应的日志信息。
在这里插入图片描述

总结

作为Spring Cloud Gateway中的重要组件,Filter可以对传入的HTTP请求进行处理,以便对其进行修改或验证,或者在路由到目标服务之前/之后执行特定逻辑。Filter是Gateway的核心部分,用于提供一种通用的机制来处理HTTP请求,并帮助实现更强大、高效和安全的网关。

Spring Cloud Gateway提供了三种不同类型的Filter:全局过滤器、局部前置过滤器和局部后置过滤器。其中,全局过滤器将应用于所有路由,而局部过滤器则仅适用于指定的路由。

通过自定义Filter,我们可以实现多种自定义需求。例如,我们可以创建一个针对具体请求路径的认证过滤器,以验证用户是否有访问相应资源的权限;也可以编写一个记录日志的Filter,在请求被路由到目标服务之前/之后输出相关日志信息。

编写自定义Filter的步骤通常包括以下几点:

创建一个继承AbstractGatewayFilterFactory的Filter类。
在Filter类中重写apply方法并编写自定义逻辑。
配置Filter类中所需的参数(可选)。
在Spring Cloud Gateway的路由配置中添加Filter。
当然,需要根据实际需求进行调整,例如定义不同类型、不同粒度的Filter等等。

总之,Filters提供了一种灵活、可靠且可扩展的机制,以便应对各种需求。在开发网关时,Filter是非常重要的组件,其在保证高效性和可扩展性方面都具有重要作用。

更多推荐

求 2+22+222+2222+...+22..·22(n个2)(精确计算)

目录(1)求2+22+222+2222+...+22..·22(n个2)(精确计算)计算机组成原理与操作系统之间区别乘式还原,有乘法运算如下OOOXOO--------OOOOOOOO-------------OOOOO式中18个O位置上的数字全部是素数(2,3,5或7),请还原这算式(1)求2+22+222+2222

vue学习-02vue入门之组件

删除Vue-cli预设在用户根目录下(C:\Users\你的用户名)这个地址里有一个.vuerc文件,修改或删除配置组件Props(组件之间的数据传递)Prop的大小写(camelCasevskebab-case)不敏感Prop类型:StringNumberBooleanArrayObjectDateFunctionS

方案:AI赋能,森林防火可视化智能监管与风险预警系统解决方案

一、方案背景森林火灾是世界八大自然灾害之一,具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点,严重危及人民生命财产和森林资源安全,甚至引发生态灾难。有效预防和及时控制森林火灾是保护国家生态建设成果、推进生态文明建设的重要措施。监管痛点:1)现有的森林防火监测系统落后,以人工地面巡护、瞭望塔高点巡查为主

【群晖NAS】Synology drive套件安装设置与结合内网穿透实现远程访问——“cpolar内网穿透”

文章目录前言1.群晖SynologyDrive套件的安装1.1安装SynologyDrive套件1.2设置SynologyDrive套件1.3局域网内电脑测试和使用2.使用cpolar远程访问内网SynologyDrive2.1Cpolar云端设置2.2Cpolar本地设置2.3测试和使用3.结语前言群晖作为专业的数据

【基础篇】六、基于SpringBoot来整合SSM的案例(下)

文章目录1、前后端调用:axios发送异步请求2、添加功能3、删除功能4、修改功能5、异常消息处理6、分页功能7、分页Bug处理8、条件查询接下来加入前端页面,使用axios发送异步请求调用上篇的接口。调前端代码时,发现还挺有趣,刷新、隐藏、调用、以及一些交互逻辑的代码翻译,等框架学完看看前端的东西。1、前后端调用:a

学习视觉SLAM需要会些什么?

前言SLAM是现阶段很多研究生的研究方向,我也是作为一个即将步入视觉SLAM的研究生,网上对于SLAM的介绍很多,但很少有人完整系统的告诉你学习视觉SLAM该有那些基础,那么此贴将告诉你学习SLAM你要有那些方面的基础。文章目录前言1.经典视觉SLAM的框架2.高等数学、线性代数、概率论、矩阵论3.C++语法基础4.L

【Linux】如何使用 WSL 在 Windows 上安装 Linux

Linux如何使用WSL在Windows上安装Linux开发人员可以在Windows计算机上同时访问Windows和Linux的强大功能。通过适用于Linux的Windows子系统(WSL),开发人员可以安装Linux发行版(例如Ubuntu、OpenSUSE、Kali、Debian、ArchLinux等),并直接在W

nodejs中的错误类型及捕获处理

nodejs中的错误类型及捕获处理在node中,提供了error模块,并且内置了标准的JavaScript错误,本文将介绍在node中错误类型以及如何捕获。错误类型js错误标准的js错误,跟在浏览器中运行js时提示的错误类型一样RangeError当一个值不在其所允许的范围或者集合中。例如不能将数字的有效位数位1-10

Python语言学习实战-内置函数sorted()的使用(附源码和实现效果)

实现功能sorted()函数是Python的内置函数之一,用于对可迭代对象进行排序操作。它可以对列表、元组、字符串等可迭代对象进行排序,并返回一个新的已排序的列表。sorted()函数的语法如下:sorted(iterable,key=None,reverse=False)其中,iterable是要排序的可迭代对象;k

【基于MBD开发模式的matlab持续集成(一)】

基于MBD开发模式的matlab持续集成引言或许是感受到行业内卷的愈加激烈,在传统制造和高新技术相结合的新能源领域对软件工程开发的要求也愈加提高,尤其在互联网已经大行其道的敏捷开发,便顺其自然的被新能源的老板们所看重。概述本文包含两块内容,第一是使用jenkins+git打造一个可自动构建的持续集成环境,这个是互联网的

以创新抵御经济环境压力:自动化测试ReadyAPI帮助企业平衡软件质量与成本控制

任何行业的公司都可能会经历严重的财务困境,这种困境往往导致供应链中断、劳动力短缺和运营成本增加。通货膨胀压力、利率上升和地缘政治不确定性的压力加重了企业的资产负债。企业需要适应不断演变的消费者需求和数字化转型,加上面临着激烈的竞争,利润空间收到压缩。这些财务困境迫使企业探索创新的方法,在高度不稳定的经济环境中保持弹性并

热文推荐