03-详解网关的过滤器工厂和常见的网关过滤器路由过滤器,默认过滤器,全局过滤器的执行顺序
过滤器工厂
过滤器种类
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务响应的结果做加工处理

Spring提供了31中不同的路由过滤器工厂

AddResponseHeader表示给请求添加响应头
default-filters: # 默认过滤器
- AddResponseHeader=X-Response-Default-Red, Default-Blue # 添加响应头X-Response-Default-Red: Default-Blue
PrefixPath表示给请求添加路径前缀
default-filters: # 默认过滤器
- PrefixPath=/httpbin
AddRequestHeader表示给请求添加key为X-Request-red,value为blue的请求头,可以应用于流量染色
filters: # 服务过滤器
- AddRequestHeader=X-Request-red, blue # 添加请求头X-Request-red: blue
AddRequestHeadersIfNotPresent表示给请求添加请求头,但只有当请求头里没有对应的请求头时才会添加,如果有则会传递原始的请求头
filters:# 添加多个请求头X-Request-Color-1:blue,X-Request-Color-2:green
- AddRequestHeadersIfNotPresent=X-Request-Color-1:blue,X-Request-Color-2:green
AddRequestParameter表示给请求添加请求参数
filters:
- AddRequestParameter=red, blue # 添加请求参数red=blue
AddResponseHeader表示给请求添加响应头
filters:
- AddResponseHeader=X-Response-Red, Blue # 给请求添加响应头X-Response-Red: Blue
CircuitBreaker(断路器)用于给接口做降级,当接口报错时降级去请求另一个接口
- 在使用断路器之前,需要先引入
spring-cloud-starter-circuitbreaker-reactor-resilience4j依赖
spring:cloud:gateway:routes:- id: circuitbreaker_routeuri: lb://backing-service:8088predicates:- Path=/consumingServiceEndpointfilters:- name: CircuitBreakerargs:name: myCircuitBreakerfallbackUri: forward:/inCaseOfFailureUseThis- RewritePath=/consumingServiceEndpoint, /backingServiceEndpoint
RequestRateLimiter表示使用Redis做限流,使用的令牌桶算法如漏桶算法RedisLimitHandler
filters:
- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10redis-rate-limiter.burstCapacity: 20redis-rate-limiter.requestedTokens: 1
RedirectTo根据请求头里包含的状态码重定向到某个地址
spring:cloud:gateway:routes:- id: prefixpath_routeuri: https://example.orgfilters:- RedirectTo=302, https://acme.org # 当请求头里包含302的状态码时重定向到该地址
RemoveRequestHeader表示删除请求中对应的请求头
filters:
- RemoveRequestHeader=X-Request-Foo
RemoveRequestParameter表示删除请求中对应的请求参数
filters:
- RemoveRequestParameter=red
RemoveResponseHeader表示删除响应中对应的响应头
filters:
- RemoveResponseHeader=X-Response-Foo
RequestHeaderSize表示限制请求的请求头大小
filters:
- RequestHeaderSize=1000B # 如果请求头超过1000B,则会发送431状态码
网关三大过滤器
路由过滤器
需求: 给所有进入userservice服务的请求都添加一个请求头如Truth=Hello World!,当前过滤器写在userservice服务下因此仅对当前路由的请求生效
server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:80 # nacos地址gateway:routes: # 网关路由配置- id: user-serviceuri: lb://userservice # 配置userservice服务的路由规则predicates:- Path=/user/**filters:- AddRequestHeader=Truth,Hello World! # 添加请求头Truth,值是Hello World!
在UserController中编写对应的控制器方法获取请求头信息,重启网关服务和userservice服务并访问http://localhost:10010/user/test
@GetMapping("/test")
public void test(@RequestHeader("Truth") String tmp) {System.out.println(tmp);
}
默认过滤器
默认过滤器: 如果希望过滤器的操作对所有的路由都生效,则可以将过滤器工厂写到spring.cloud.gateway.default-filters属性下
server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:80 # nacos地址gateway:routes:- id: user-serviceuri: lb://userservicepredicates:- Path=/user/**default-filters: # 默认过滤器,对所有的路由请求都生效- AddRequestHeader=Truth,Hello World!
全局过滤器
全局过滤器和GatewayFilter一样都可以对进入网关的请求和微服务的响应做加工处理
GatewayFilter网关过滤器: 通过配置文件定义所以处理的逻辑是固定的且只有默认过滤器对所有路由请求生效GlobalFilter全局过滤器: 可以编写代码做自己的业务逻辑,如登录状态判断,权限校验,请求限流等,对所有的路由请求都生效
public interface GlobalFilter {/*** 处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理** @param exchange 请求上下文,里面可以获取Request、Response等信息* @param chain 用来把请求委托给下一个过滤器 * @return {@code Mono<Void>} 返回标示当前过滤器业务结束*/Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
需求: 定义全局过滤器拦截请求,判断请求参数中是否有authorization且参数值是否为admin, 如果同时满足则放行请求否则拦截
第一步: 在gateway模块下新建cn.itcast.gateway.filter包,然后编写AuthorizationFilter类实现GlobalFilter接口并重写其中的filter方法
@Order(-1)
@Component
public class AuthorizationFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1. 获取请求参数ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> params = request.getQueryParams();// 2. 获取authorization参数的值String authorization = params.getFirst("authorization");// 3. 校验if ("admin".equals(authorization)) {// 4. 满足需求则放行return chain.filter(exchange);}// 拦截请求// 5.1 先设置状态码,这里的常量底层就是401(在restFul中401表示未登录)exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 5.2 拦截请求return exchange.getResponse().setComplete();}
}
第二步: 重启网关测试我们的全局过滤器是否生效,只有访问http://localhost:10010/user/1?authorization=admin时可以看到正常数据
{"id": 1,"username": "柳岩","address": "湖南省衡阳市"
}
过滤器执行顺序
请求进入网关后会经过路由过滤器,DefaultFilter,GlobalFilter三类过滤器,它们本质都是GatewayFilter(GlobalFilter被封装在GatewayFilterAdapter中)
- 请求路由后会将
当前路由过滤器,DefaultFilter,GlobalFilter合并到一个过滤器链集合中,在集合中根据order值对每个过滤器排序后依次按顺序执行

过滤器必须指定一个int类型的order值,order值越小优先级越高即执行顺序越靠前(默认值为int最大值2147483647)
路由过滤器和de默认过滤器的order值: 由Spring指定默认是按照声明顺序从1递增全局过滤器的order值: 通过实现Ordered接口实现getOrder()方法或者添加@Order注解来指定order值
//@Order(-1)
@Component
public class AuthorizationFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1. 获取请求参数MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();// 2. 获取authorization参数String authorization = params.getFirst("authorization");// 3. 校验if ("admin".equals(authorization)) {// 4. 满足需求则放行return chain.filter(exchange);}// 5. 不满足需求,设置状态码,这里的常量底层就是401,在restFul中401表示未登录exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 6. 结束处理return exchange.getResponse().setComplete();}@Overridepublic int getOrder() {return -1;}
}
过滤器的order值相同: 按照defaultFilter > routeFilter > GlobalFilter的顺序执行
- org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#
getFilters()方法: 负责加载defaultFilters然后再加载某个路由过滤器最后合并 - org.springframework.cloud.gateway.handler.FilteringWebHandler#
handle()方法: 负责加载全局过滤器最后与路由过滤器和默认过滤器合并
# 配置路由过滤器和默认过滤器
server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:80 # nacos地址gateway:routes:- id: user-serviceuri: lb://userservicepredicates:- Path=/user/**filters: # 路由过滤器默认是按照声明顺序从1递增- AddRequestHeader=Truth,Hello World! # order值为1- RemoveRequestHeader=X-Request-Foo # order值为2default-filters: # 默认过滤器- AddRequestHeader=Truth,Hello World! # order值为1- RemoveRequestHeader=X-Request-Foo # order值为2# 将自定义的全局过滤器的order也设定为1
相关文章:
03-详解网关的过滤器工厂和常见的网关过滤器路由过滤器,默认过滤器,全局过滤器的执行顺序
过滤器工厂 过滤器种类 GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务响应的结果做加工处理 Spring提供了31中不同的路由过滤器工厂 AddResponseHeader表示给请求添加响应头 default-filters: # 默认过滤器 - AddResponseHeaderX-Response-Default-R…...
基于SSM的小儿肺炎知识管理系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
HuffMan tree
定义 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 基础知识 路…...
各地加速“双碳”落地,数字能源供应商怎么选?
作者 | 曾响铃 文 | 响铃说 随着我国力争2030年前实现“碳达峰”、2060年前实现“碳中和”的“双碳”目标提出,为各地区、各行业的低碳转型和绿色可持续发展制定“倒计时”时间表,一场围绕“数字能源”、“智慧能源”、“新能源”等关键词的创新探索进…...
19.java绘图
A.Graphics类 Graphics类是java.awt包中的一个类,它用于在图形用户界面(GUI)或其他图形应用程序中进行绘制。该类通常与Component的paint方法一起使用,以在组件上进行绘制操作。 一些Graphics类的常见用法和方法: 在组…...
提升工作效率,尽在Microsoft Office LTSC 2021 for Mac!
在当今的办公环境中,高效率的工作是每个人都追求的目标。作为全球领先的办公软件套装,Microsoft Office LTSC 2021 for Mac将为您提供一站式的解决方案,帮助您轻松应对各种工作任务。 首先,Microsoft Office LTSC 2021 for Mac拥…...
day24_java的反射机制
反射 一、反射的概念 反射:加载类,反射出类的各个组成部分(类的成员:构造方法,属性,方法) java反射机制:在运行状态中,对于任何一个类都能够知道这个类的所有属性和方…...
VUE学习二、创建一个前端项目
1.创建一个vue项目 使用命令 vue ui启动vue脚手架 vue ui 等待项目创建好 可以来任务栏启动项目 参数那里可以设置启动端口等参数 启动成功 成功访问 2. 用webstorm 打开项目 脚手架页面可安装基本依赖 比如路由 使用ws打开项目 启动项目 npm run serve 3.修改启动…...
「红队笔记」靶机精讲:Prime1 - 信息收集和分析能力的试炼
「红队笔记」靶机精讲:Prime1 - 信息收集和分析能力的试炼 本文是作者在观看 B 站《红队笔记》后做的一些笔记及相关知识的补充。学渗透特别推荐大家去看。如有侵权,请联系作者,作者看到后会第一时间删除。 靶机精讲之Prime1,vu…...
JVM虚拟机系统性学习-对象的创建流程及对象的访问定位
对象的创建流程与内存分配 对象创建流程如下: Java 中新创建的对象如何分配空间呢? new 的对象先放 Eden 区(如果是大对象,直接放入老年代)当 Eden 区满了之后,程序还需要创建对象,则垃圾回收…...
perf与火焰图-性能分析工具
参考链接 perf性能分析工具使用分享 如何读懂火焰图?-阮一峰 perf基本用法-record,report-知乎 火焰图抓取 准备: centos安装perf工具 dnf install perf下载火焰图解析代码 git clone https://github.com/brendangregg/FlameGraph.git抓取指定进程…...
UniGui使用CSSUniTreeMenu滚动条
有些人反应UniTreeMenu当菜单项目比较多的时候会超出但是没有出滚动条,只需要添加如下CSS 老规矩,unitreemeu的layout的componentcls里添加bbtreemenu,然后在css里添加 .bbtreemenu .x-box-item{ overflow-y: auto; } 然后当内容超出后就会…...
Spring框架中的五种常用设计模式
1、单例模式 Spring 的 Bean 默认是单例模式,通过 Spring 容器管理 Bean 的⽣命周期,保证每个 Bean 只被 创建⼀次,并在整个应⽤程序中重用。 2.工厂模式 Spring 使⽤⼯⼚模式通过 BeanFactory 和 ApplicationContext 创建并管理 Bean 对象…...
华纳云:docker启动报错的原因和解决方法
Docker 启动报错可能由多种原因引起。以下是一些建议,可用于解决 Docker 启动问题: 查看 Docker 日志: 查看 Docker 的日志可以提供更多的详细信息,有助于定位问题。 sudo journalctl -xe | grep docker 或者查看 Docker 服务的详…...
代码规范及开发工具
代码规范及开发工具: 前端(vscode、idea): JavaScript规范: 1. 谷歌开源项目风格指南:JavaScript 、TypeScript篇 https://zh-google-styleguide.readthedocs.io/en/latest/google-typescript-…...
证件照制作小程序源代码
17638103951(同v)...
自治调优!人大金仓解放DBA双手
数据库系统的性能是确保整个应用系统高效运转的关键因素,因此数据库性能调优工作至关重要。KingbaseES通过将人工调优过程内化为数据库内核,成功实现了自治调优。这种创新的调优方案为DBA提供了更高效且准确的性能调优途径,同时也显著降低了数…...
深度学习环境配置------windows系统(GPU)------Pytorch
深度学习环境配置------windows系统(GPU)------Pytorch 准备工作明确操作系统明确显卡系列 CUDA和Cudnn下载与安装1.下载2.安装 环境配置过程1.安装Anacoda2.配置环境1)创建一个新的虚拟环境2)pytorch相关库的安装 2.安装VScode1&…...
el-menu标题过长显示不全问题处理
项目基于vue-element-admin 问题 期望 处理方式 \src\layout\components\Sidebar\index.vue 文件后添加CSS <style scped> /* 侧栏导航菜单经典 文字超长溢出问题 CSS折行 */ .el-submenu__title {display: flex;align-items: center; } .el-submenu__title span {white-…...
微信游戏开发:连接社交与娱乐的创新之路
在移动互联网时代,微信已经成为了人们日常生活中不可或缺的社交工具。而微信游戏,作为在这一平台上崛起的新兴产业,不仅给用户提供了更多娱乐选择,也为开发者们创造了独特的机遇。本文将探讨微信游戏开发的关键步骤、技术要点以及…...
Allegro 17.4 Via Array 实战:3分钟搞定PCB板边与铺铜区的屏蔽过孔阵列
Allegro 17.4 Via Array高效应用:从板边屏蔽到铺铜优化的实战解析 在高速PCB设计中,过孔阵列的应用早已超越了简单的电气连接功能。资深Layout工程师们发现,合理布置的过孔阵列能够显著提升板边屏蔽效果、优化电源平面阻抗分布,甚…...
PIC32MZ EF嵌入式开发实战:硬件FPU与多协议连接方案解析
1. 项目概述:为什么是PIC32MZ EF?在嵌入式开发领域,尤其是涉及复杂控制、实时信号处理或物联网边缘计算时,我们常常面临一个经典矛盾:对计算性能的渴求与对功耗、成本和开发复杂度的现实考量。几年前,当我接…...
Fluent模拟火箭发动机喷管?试试用分子动理论定义气体属性,避开数据缺失的坑
火箭发动机喷管仿真中的分子动理论实战:突破高温燃气物性数据困境 当你在Fluent中打开火箭发动机喷管的仿真项目时,面对H2/CO/H2O混合燃气在3000K温度梯度下的物性参数定义,是否曾为找不到可靠数据而抓狂?传统方法需要逐个温度点…...
对比直接使用厂商 API 观察 Taotoken 在用量与成本可视化方面的优势
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用厂商 API 观察 Taotoken 在用量与成本可视化方面的优势 效果展示类,从个人开发者视角出发,分享…...
3步完成Android Studio中文界面配置:终极汉化指南
3步完成Android Studio中文界面配置:终极汉化指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Android Stud…...
CANape测量启动报错“存储空间不足”的系统性排查与解决方案
1. 问题现象与根源剖析如果你是一名汽车电子工程师,或者从事车辆标定、诊断与测试工作,那么CANape这个软件对你来说,就像吃饭用的筷子一样熟悉。它强大的测量、标定和诊断功能,是我们在开发过程中不可或缺的利器。然而,…...
从机翼到飞行:空气动力学核心概念与应用解析
1. 翼型:飞机飞行的秘密藏在形状里 第一次看到飞机机翼横截面时,我盯着那个水滴状的形状看了足足十分钟。这个被称为翼型的二维轮廓,藏着人类百年航空史最精妙的设计智慧。就像鱼类的流线型身体决定了游泳效率,翼型的每个曲线转折…...
【免费下载】 Maven 3.8.5 压缩包下载【maven下载安装与配置】
Maven 3.8.5 压缩包下载 简介 本仓库提供 Maven 3.8.5 版本的压缩包下载。Maven 是一个强大的项目管理和构建自动化工具,广泛应用于 Java 项目的开发中。 资源文件 文件名: maven3.8.5压缩包描述: Maven 3.8.5 版本的压缩包 下载链接 请点击以下链接下载 Mave…...
【Android】CloneTTS最强朗读听书引擎-可克隆一切音色
【Android】CloneTTS最强朗读听书引擎-可克隆一切音色 链接:https://pan.xunlei.com/s/VOsu4mh3O_d7zjeERkKPfcG4A1?pwddi3y# CloneTTS 是一款运行在安卓系统本地的文字转语音(TTS)原生引擎,允许用户离线克隆所需的声音并直接使用该声音来朗读书籍或长…...
FPGA资源省一半?揭秘多相滤波器在抽取/内插中的高效实现结构与Xilinx IP核配置要点
FPGA资源优化实战:多相滤波器在采样率转换中的高效架构与Xilinx IP核深度配置 当信号处理系统面临严苛的资源约束时,工程师们常常需要在性能与成本之间走钢丝。多相滤波器结构就像一位精明的财务顾问,能帮你在FPGA资源预算紧张的情况下&#…...
