gateway之过滤器(Filter)详解

news2024/12/23 18:54:25

文章目录

  • 什么是过滤器
    • 过滤器的种类
      • 局部过滤器
      • 代码示例
      • 全局过滤器
      • 代码示例
  • 总结

什么是过滤器

在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是非常重要的组件,其在保证高效性和可扩展性方面都具有重要作用。

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

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

相关文章

CRM客户管理系统主要用途

对于大多数企业而言业绩就是生命线&#xff0c;因此销售环节在企业管理过程中意义重大。面对愈发内卷的市场竞争企业就要借助CRM销售管理系统改善各个环节存在的漏洞&#xff0c;占据优势。那么&#xff0c;销售管理系统的用途有哪些&#xff0c;接下来我们从下面3个功能来介绍…

ESP32-IDF使用I2S驱动MAX98375--解析WAV文件

一. 简介 本篇文章将介绍如何使用ESP32S3通过I2S发送WAV音频数据&#xff0c;驱动MAX98375A进行音频的播放。是EVE_V2项目开发的一部分工作。 二. MAX98375A介绍 芯片特性如下&#xff0c;可以在芯片手册上找到。 单电源工作(2.5V至5.5V)3.2W输出功率&#xff1a;4Ω&#…

anaconda安装完成之后输入conda -V没有反应

anaconda安装完成后&#xff0c;conda没有反应 vim ~/.bashrc后面添加内容 # added by Anaconda3 5.3.0 installer # >>> conda init >>> # !! Contents within this block are managed by conda init !! __conda_setup"$(CONDA_REPORT_ERRORSfalse /u…

springboot实战(七)之jackson配置前后端交互下划线转驼峰对象序列化与反序列化

目录 环境&#xff1a; 1.驼峰转下划线配置 1.1单个字段命名转化使用JsonProperty注解 1.2单个类进行命名转化使用JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)注解 3.全局命名策略配置 2. 序列化以及反序列化 2.1序列化 2.2反序列化 3.自定义序列…

ImageJ查看图像灰度值矩阵及像素编号从0开始

ImageJ查看图像灰度值矩阵 imagej打开一幅图像 然后image —— transform——image to results&#xff0c;等一下就会出现灰度值矩阵 我读取的如下&#xff0c;可以看出&#xff0c;imagej对像素的编号是从0开始的&#xff0c;切记&#xff01;&#xff01;&#xff01;跟C/…

【论文笔记】Scene as Occupancy

原文链接&#xff1a;https://arxiv.org/abs/2306.02851 1. 引言 与传统的3D框物体表达相比&#xff0c;使用3D占用表达是几何感知的&#xff0c;因为3D框表达简化了物体的形状。此外&#xff0c;现有基于视觉的方法很少考虑时间信息&#xff1b;单阶段方法缺少从粗到细的细化…

Linux 线程(thread)

进程线程区别 创建线程 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); -功能&#xff1a;创建一个子线程&#xff0c;一般情况下main函数所在的线程称为主线程&#xff0c;…

科技资讯|Canalys发布全球可穿戴腕带设备报告,智能可穿戴增长将持续

市场调查机构 Canalys 近日发布报告&#xff0c;表示 2023 年第 2 季度全球可穿戴腕带设备出货量达 4400 万台&#xff0c;同比增长了 6%。 主要归功于其亲民的价格以及消费者对价位较高的替代品仍持谨慎态度&#xff0c;基础手环市场尽管与去年同期相比有所下降&#xff0c;…

JDBC连接mysql

文章目录 JDBC简介JDBC-MYSQL驱动下载JDBC使用通过结果集查询 PreparedStatement 预处理查询事务批处理连接池1.C3P02.德鲁伊 druid DBUtils工具 JDBC简介 JDBC(Java Data Connectivity,java数据库连接)是一种用于执行sql语句的JavaAPI&#xff0c;可以为多种关系数据库提供统…

极简式看图软件 Pixea Plus for Mac

Pixea Plus for Mac介绍 简单易用&#xff1a;Pixea的用户界面非常简洁直观&#xff0c;容易上手。 图片管理&#xff1a;Pixea允许用户创建个人或业务相册&#xff0c;并提供了图片搜索、排序、过滤等多种管理功能&#xff0c;方便用户组织和查找照片。 图片编辑&#xff1…

【Java 基础篇】Java网络编程:文件下载详解

文件下载是网络应用程序中的一个常见任务&#xff0c;允许用户从远程服务器获取文件。Java提供了丰富的网络编程库&#xff0c;使文件下载变得相对简单。本文将详细介绍如何使用Java进行文件下载&#xff0c;并提供一些相关内容的解释。 什么是文件下载 文件下载是指从一个网…

Django之初入门

一&#xff09;Django简介 1.简介 Django是一个开源的Python Web框架&#xff0c;它以简洁高效的方式帮助开发者构建复杂的Web应用程序。Django采用了MVC&#xff08;Model-View-Controller&#xff09;的架构模式&#xff0c;通过强大的工具和功能&#xff0c;提供了一套完整…

最新版本 在线生成SSL证书源码 后台对接ssl证书api接口

SSL证书是保证网络安全的基本保障之一。向您介绍我们的在线生成SSL证书系统&#xff0c; 支持在线生成SSL证书系统&#xff0c;用户登录可在线申请SSL&#xff0c;后台对接ssl证书api接口。

金融行业如何利用软文营销进行品牌维护

金融行业作为强监管行业&#xff0c;与人民财产息息相关&#xff0c;因此塑造可靠的品牌形象是金融行业必须面对的课题&#xff0c;而金融行业的特性决定了它在品牌传播与建设上会受到一定的限制&#xff0c;因此金融行业想要进行品牌维护的话&#xff0c;软文营销就是非常不错…

频频刷屏朋友圈,白酒如何越来越年轻化?来聊聊白酒企业数字化

最近&#xff0c;某白酒品牌频频吸引大众眼球&#xff0c;白酒与咖啡、巧克力等联名衍生品一经推出便掀起热潮。某商品由于太过火爆&#xff0c;甚至一度售罄下架。 不得不说&#xff0c;我国拥有超大规模内需市场&#xff0c;消费潜力巨大。 当前&#xff0c;创新消费场景加…

vue 路由中 vite 与webpack 动态 导入的方法汇总

vite 动态导入路由&#xff1a; router/index.js文件 //vite 下面寻找 views 文件夹下面所有的page.js文件 let pageList import.meta.glob(../views/**/page.json, {eager: true,import: default, }); //所有的文件 const modules import.meta.glob(../views/**/**.vue);/…

el-select 下拉框全选、多选的几种方式组件

组件一、基础多选 适用性较广的基础多选&#xff0c;用 Tag 展示已选项 <template><el-select v-model"value1" multiple placeholder"请选择"><el-optionv-for"item in options":key"item.value":label"item.la…

linux下特定usb设备的权限设置

文章目录 背景查找资料解决方案 背景 目前我在Ubuntu下使用一个USB热成像摄像头&#xff0c;通过调用它的sdk进行图像的采集以及获取对应像素点的温度。假设我现在的测试程序名称为MyApp。 当我用下面的命令运行时&#xff0c;程序是正常运行且能从热成像仪采集图像 sudo ./M…

上新!100%国产物料认证,米尔入门级国产核心板全志T113-i方案

自米尔国产全志T113系列的核心板发布以来&#xff0c;这款高性价比、低成本、入门级、高性能的国产核心板咨询不断&#xff0c;配套的开发板已经成交量数百套&#xff0c;深受工程师们的青睐&#xff0c;为了集齐T113全系列的产品&#xff0c;这次米尔发布了基于全志T113-i处理…

Spring学习笔记2 Spring的入门程序

Spring学习笔记1 启示录_biubiubiu0706的博客-CSDN博客 Spring官网地址:https://spring.io 进入github往下拉 用maven引入spring-context依赖 写spring的第一个程序 引入下面依赖,好比引入Spring的基本依赖 <dependency><groupId>org.springframework</groupId&…