当前位置: 首页 > news >正文

关于Spring Cloud Gateway中 Filters的理解

Spring Cloud Gateway中 Filters的理解

Filters

Filters拦截器的作用是,对请求进行处理

可以进行流量染色

增加请求头

例子

spring:cloud:gateway:routes:- id: add_request_header_routeuri: http://localhost:8123predicates:- Path=/api/**filters:- AddRequestHeader=ylx,666

访问 http://localhost:8080/api/name 自动跳转到 http://localhost:8123/api/name

http://localhost:8123/api/name 后端中获取request.getHeader(“ylx”) 中的请求头,打印出来666

说明添加请求头成功

我们可以通过在请求头上添加信息,特定的标识,可以实现对接口的保护,确保只有带有这个请求头的请求才能被下游的服务认可并允许调用。这就是流量染色

⭐增加请求参数

spring:cloud:gateway:routes:- id: add_request_header_routeuri: http://localhost:8123predicates:- Path=/api/**filters:- AddRequestHeader=ylx,666- AddRequestParameter=name,ylx

在这里插入图片描述

过滤器AddRequestParameter=name,ylx 添加ylx到参数name中

❓为什么控制器方法参数没有添加注解@RequestParam gateway网关中配置的添加请求参数也能添加到控制器的方法参数中?
💡请求参数默认绑定: 在 GET 请求中,控制器方法的参数如果与请求中的参数名匹配,Spring MVC 会自动将请求参数绑定到方法参数上。这种自动绑定的行为是 Spring MVC 的核心功能之一,不需要显式的 @RequestParam 注解。@RequestParam 注解只是用于明确指定请求参数名和方法参数之间的映射关系,但如果参数名匹配,Spring MVC 会自动处理这个绑定。

添加响应头

server:port: 8080
spring:cloud:gateway:routes:- id: add_request_header_routeuri: http://localhost:8123predicates:- Path=/api/**filters:- AddResponseHeader=ylxresponse,success

访问 localhost:8080/api/name 自动跳转到 localhost:8123/api/name

打开浏览器控制台,查看响应,响应成功

在这里插入图片描述

CircuitBreaker(断路器)

断路器的作用:实现服务的降级。

使用前提:
添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>

在项目gateway中添加配置

spring:cloud:gateway:routes:- id: add_request_header_routeuri: http://localhost:8123predicates:- Path=/api/**filters:- AddResponseHeader=ylxresponse,success- name: CircuitBreakerargs: name: myCircuitbreakerfallbackUri: forward:/fallback- id: new_routeuri: https://www.ylxovo.cyoupredicates:- Path=/fallback

解释:

路由一

add_request_header_route

重定向地址:http://localhost:8123

断言:Path=/api/**

过滤器:

  1. 添加响应头:ylxresponse,success
  2. 添加断路器:
    1. name: CircuitBreaker
    2. 参数args:
      1. name: 短路器名称
      2. 降级地址:forward:/fallback

路由二

new_route

重定向地址:https://www.ylxovo.cyou

断言:Path=/fallback

add_request_header_route路由会添加响应头,并通过断路器实现降级功能。当路由的目标地址出现故障,请求会被转发到 /fallback路由,路由二的断言规则符合,则将路由转发到路由二中,即new_route

CacheRequestBody

作用:让原本的请求信息中的body参数可以被多次读取。默认情况下,请求中的body参数只能被读取一次,使用这个配置之后,可以多次的读取请求中的body参数,并将其作为一个持久化的缓存。

spring:cloud:gateway:routes:- id: cache_request_body_routeuri: lb://downstreampredicates:- Path=/downstream/**filters:- name: CacheRequestBodyargs:bodyClass: java.lang.String

DedupeResponseHeader 去重复

作用:请求经过多个服务器之后,每个服务器都会添加一个跨域头。但是都是重复的跨域头,可能会导致最终跨域失败,为了解决这个问题,我们可以使用这个配置来去除重复的响应头;检查响应头是否包含重复的头信息,并进行去重处理。另外还提供了一些去重策略。

spring:cloud:gateway:routes:- id: dedupe_response_header_routeuri: https://example.orgfilters:- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

Retry Gateway filter 重试

Retry 网关过滤器在 Spring Cloud Gateway 中用于自动重试失败的请求。这对于处理临时性的网络问题或者服务的不稳定性非常有用。

配置Retry网关过滤器

spring:cloud:gateway:routes:- id: retry_routeuri: http://httpbin.orgfilters:- name: Retryargs:retries: 3 # 设置重试次数statuses: 500, 502, 503, 504 # 设置哪些 HTTP 状态码会触发重试backoff: 2000 # 设置重试的间隔时间,单位是毫秒predicates:- Path=/delay/3

⭐Default filters 默认过滤器

以上我们过滤器都是在单个路由下,只在一个路径下生效,或者是对一个断言生效。

Default filters 可以给整个网关订一些默认的过滤器,比如染色功能

全局的染色:给所有经过网关的请求都加一个响应头

spring:cloud:gateway:default-filters:- AddResponseHeader=source, ylx

⭐跨域配置

可以直接在网关定义想要的跨域配置、可以指定允许跨域的请求头,那些请求需要跨域支持,以及允许的跨域方法,通过网关配置可以简单的集中地管理跨域设置

Spring Cloud Gateway 并不直接提供一个全局的 CORS 过滤器,而是通过 Spring 的标准方式配置 CORS。你可以通过 Spring Boot 的 CorsConfigurationCorsConfigurationSource 实现这个功能。下面是具体的步骤和示例:

spring:cloud:gateway:globalcors:cors-configurations:"[/**]":allowedOrigins: "*"allowedMethods:- GET- POST- PUT- DELETE- OPTIONSallowedHeaders:- "*"allowCredentials: true

这个配置会为所有路径([/**])启用 CORS。具体参数说明如下:

  • allowedOrigins: 允许哪些源访问,* 表示允许所有源。你可以根据需要设置具体的源地址。
  • allowedMethods: 允许的 HTTP 方法。你可以指定 GET, POST, PUT, DELETE, OPTIONS 等。
  • allowedHeaders: 允许的请求头,* 表示允许所有头部。你也可以设置具体的头部名称。
  • allowCredentials: 是否允许发送凭证(如 cookies)。设置为 true 表示允许。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 逻辑模型/物理模型
  • Flutter启动无法运行热重载
  • 部署opengauss5.0.3,细节满满
  • 力扣最热一百题——螺旋矩阵
  • 18063 圈中的游戏
  • C/C++语言基础--从C到C++的不同(上)
  • ListBox显示最新数据、左移和右移操作
  • 对中文进行文本分类的常用方法
  • openssl+keepalived安装部署
  • GPT-4论文阅读
  • 9.15 BFS中等 133 Clone Graph review 138 随机链表的复制
  • TikTok商家如何通过真人测评提高流量和销量?
  • Leetcode 第 414 场周赛题解
  • 远程桌面内网穿透是什么?有什么作用?
  • 最新安装vmware地址(官网找半天没找到)
  • 【刷算法】从上往下打印二叉树
  • css系列之关于字体的事
  • Iterator 和 for...of 循环
  • javascript数组去重/查找/插入/删除
  • Java到底能干嘛?
  • LeetCode算法系列_0891_子序列宽度之和
  • Node + FFmpeg 实现Canvas动画导出视频
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 聊聊sentinel的DegradeSlot
  • 浅谈web中前端模板引擎的使用
  • 使用 @font-face
  • 通过npm或yarn自动生成vue组件
  • MyCAT水平分库
  • #includecmath
  • (06)金属布线——为半导体注入生命的连接
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (蓝桥杯每日一题)love
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net对接阿里云CSB服务
  • .net通过类组装数据转换为json并且传递给对方接口
  • .py文件应该怎样打开?
  • /var/spool/postfix/maildrop 下有大量文件
  • @Transactional 竟也能解决分布式事务?
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [Algorithm][综合训练][kotori和气球][体操队形][二叉树中的最大路径和]详细讲解
  • [C++][基础]1_变量、常量和基本类型
  • [Day 36] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • [Java] 什么是IoC?什么是DI?它们的区别是什么?
  • [JDK工具-2] javap 类文件解析工具-帮助理解class文件,了解Java编译器机制
  • [Linux安全运维] Nginx安装部署以及LNMP框架搭建保姆级教程
  • [oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算
  • [OpenAI]继ChatGPT后发布的Sora模型原理与体验通道
  • [Qt]设置窗口图标和EXE应用程序图标
  • [RK3566-Android11] 关于 a2dpsink -蓝牙支持接收播放/无PIN码连接
  • [Samba] 一路走来