gateway之过滤器(Filter)详解

文章目录

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

什么是过滤器

在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);}@Overridepublic 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());@Overridepublic 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.mzph.cn/news/87321.shtml

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

相关文章

【力扣-每日一题】213. 打家劫舍 II

class Solution { public:int getMax(int n,vector<int> &nums){int a0,bnums[n],c0;for(int in1;i<nums.size()n-1;i){ //sizen-1,为0时&#xff0c;第一个可以偷&#xff0c;最后一个不能偷size-1&#xff1b;n为1时&#xff0c;最后一个可偷&#xff0c;计算…

Spring学习(七)——AOP

1. AOP 1.1 什么是 AOP AOP&#xff08;Aspect Oriented Programming&#xff09;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护技术。AOP 是 OOP 的延续&#xff0c;是软件开发的一个热点&#xff0c;也是 Spring 框架的一…

数据包络分析——SBM模型

写在前面&#xff1a; 博主本人大学期间参加数学建模竞赛十多余次&#xff0c;获奖等级均在二等奖以上。为了让更多学生在数学建模这条路上少走弯路&#xff0c;故将数学建模常用数学模型算法汇聚于此专栏&#xff0c;希望能够对要参加数学建模比赛的同学们有所帮助。 目录 1. …

腾讯mini项目-【指标监控服务重构-会议记录】2023-07-06

7/6 会议记录 Profile4个步骤 解压kafka消息初始化性能事件&#xff0c;分析事件将数据写入kafkaRun 开始执行各stage handler 上报耗时到otel-collector。。。 // ConsumerDispatchHandler consumer // // param msg *sarama.ConsumerMessage // param consumer *databus.K…

【rtp】mid 扩展: RtpMid 字符串扩展的解析和写入

mid 是uint8_t 类型? 扩展填写的是字符串,读取字符串后atoi 转 uint8_t : webrtc 看起来是个字符串:写入 扩展的值是改变了: 这里是更新扩展的长度: 新的大小小于原来的,没有缩减内存,而是对于多余的置位0了:if (len < current_len) {memset(

【Redis】记录一次K8S存储故障导致Redis集群拓扑异常的修复过程

文章目录 背景处理新节点遗忘旧节点 背景 集群部署在K8S环境内&#xff0c;存储使用的localpv&#xff0c;有一台K8S主机节点磁盘故障&#xff0c;导致在该节点上的redis节点均出现故障&#xff0c;主要表现为持久化失败、集群拓扑异常&#xff0c;持久化失败可以临时关闭RDB和…

冲鸭~~!10分钟部署清华ChatGLM2-6B,效果测试:不愧是中文榜单第一

来源: AINLPer公众号&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2023-9-25 引言 今年6月份清华大学发布了ChatGLM2&#xff0c;相比前一版本推理速度提升42%。最近&#xff0c;终于有时间部署测试看看了&#xff0c;部署…

次时代摸鱼骚操作:人在办公室轻松观看家里电脑上的4k电影(移动端公网访问本地群辉存储视频文件)

如何使用iPhone15在办公室观看家里电脑上的4k电影&#xff1f; 文章目录 如何使用iPhone15在办公室观看家里电脑上的4k电影&#xff1f;1.使用环境要求&#xff1a;2.下载群晖videostation&#xff1a;3.公网访问本地群晖videostation中的电影&#xff1a;4.公网条件下使用电脑…

适用于初学者,毕业设计的5个c语言项目,代码已开源

C语言项目集 项目介绍 该项目适用于初学者学习c语言&#xff0c;也适用于高校学生课程设计&#xff0c;毕业设计参考。 项目并不能满足所有人的需求&#xff0c;可进行项目指导&#xff0c;定制开发。 开源地址 c语言项目代码地址 项目列表 该项目包含如下5个管理系统&am…

在线安装qt5.15之后任意版本

下载qt现在安装包&#xff1a; window安装包链接 进入cmd&#xff0c;用命令行打开安装包&#xff0c;并指定组件下载地址&#xff08;这个是关键&#xff0c;之前用的是腾讯镜像&#xff0c;出现了版本灰色无法选中问题&#xff09; .\qt-unified-windows-x64-4.6.1-online…

git的基本操作

git的基本操作 一般思路&#xff1a; 新建个人分支加粗样式–克隆远程仓库代码—编辑本地分支代码–合入master分支&#xff08;先切换到master分支&#xff09;–master分支代码push到远程仓库 1、安装好git之后必须设置用户和邮箱信息之后才能提交代码到缓存区、本地库 git …

[C++随笔录] list使用

list使用 构造函数insert && 迭代器push_back && pop_back && push_front && pop_fronterasesort && find && reverse list的底层结构就是 带头双向循环链表 构造函数 // 默认构造 list<int> lt; cout << "l…

SolidJs节点级响应性

前言 随着组件化、响应式、虚拟DOM等技术思想引领着前端开发的潮流&#xff0c;相关的技术框架大行其道&#xff0c;就以目前主流的Vue、React框架来说&#xff0c;它们都基于组件化、响应式、虚拟DOM等技术思想的实现&#xff0c;但是具有不同开发使用方式以及实现原理&#…

基于win32实现TB登陆滑动验证

这里写目录标题 滑动验证触发条件&#xff1a;失败条件&#xff1a;解决方法:清除cooKie 滑动验证方式一&#xff1a;win32 api获取窗口句柄&#xff0c;选择固定位置 成功率高方式二&#xff1a; 原自动化滑动&#xff0c;成功率中 案例 先谈理论&#xff0c;淘宝 taobao.com …

ChatGPT详细搭建教程+支持AI绘画

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

人才测评系统在企业招聘中的应用

人才测评作为招聘工具&#xff0c;已经频繁应用在各大企业中&#xff0c;如今的社会中&#xff0c;人才对于企业而言&#xff0c;可谓是创造产值的基础。换句话说&#xff0c;”企业得人才者、才能得天下”&#xff0c;有了人才之后&#xff0c;企业在行业中才有竞争力。 目前…

ES修改字段的数据类型

-- mysql修改字段数据类型语句 ALTER TABLE 表名 MODIFY COLUMN 列名 修改的字段类型;-- hive 修改字段数据类型语句 ALTER TABLE 表名 CHANGE COLUMN 列名 修改的字段类型;--es修改字段数据类型语句无法通过一个语句进行修改。思路&#xff1a; 1、对修改字段重新建修改类型的…

【Redis】Redis做为缓存,MySQL如何与Redis保持数据一致

Redis的作用 一般情况下Redis是用来实现应用和数据库之间的一个读操作的缓存层&#xff0c;主要目的是减少数据库的io&#xff0c;还可以提升数据库io性能 方法一&#xff1a; 先更新MySQL数据库&#xff0c;再删除缓存&#xff0c;再从数据库查询到的最新的数据同步到redis…

Unity实现角色受到攻击后屏幕抖动的效果

文章目录 实现效果摄像机抖动脚本 玩家受伤其他文章 实现效果 首先看一下实现效果。 摄像机 我们要使用屏幕抖动&#xff0c;使用的是CinemachineVirtualCamera这个组件&#xff0c;这个组件需要在包管理器中进行导入。 导入这个组件之后&#xff0c;创建一个Chinemachine-…

CH2--x86系统架构概览

2.1 OVERVIEW OF THE SYSTEM-LEVEL ARCHITECTURE 图中的实线箭头表示线性地址&#xff0c;虚线表示段选择器&#xff0c;虚线箭头表示物理地址 2.1.1 Global and Local Descriptor Tables 全局描述符表 (GDT) GDT是一个全局的段描述符表&#xff0c;它存储在系统内存中的一个固…