Spring Cloud Gateway断言及过滤器使用

news2024/11/15 3:30:00

目录

1. 引入Spring Cloud Gateway

2. 核心概念

3. 工作原理

4. 配置路由断言工厂和网关过滤器工厂

5. 路由断言工厂

​5.1 断言某个时间之后

5.2 断言某个时间之前

5.3 断言某个时间之间

5.4 根据cookie值断言

5.5 根据请求的标头断言

5.6 根据主机名来断言

5.7 根据请求方法来断言

5.8 根据请求路径来断言

5.9 根据查询参数来断言

5.10 根据远程用户的IP地址来断言

5.11 根据权重来断言

6. 网关过滤器工厂

6.1 AddRequestHeader 网关过滤器

6.2 AddRequestParameter 网关过滤器

 6.3 AddResponseHeader 网关过滤器

 6.4 Spring Cloud Breaker GatewayFilter 过滤器

6.5 删除重复的响应头过滤器

6.6 更新请求标头过滤器

6.7 前缀路径过滤器

 6.8 删除请求头过滤器

6.9 删除请求参数过滤器

6.10 删除响应头过滤器

6.11 重写路径过滤器


官方文档:Spring Cloud Gateway

1. 引入Spring Cloud Gateway

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

 是否开启网关配置:spring.cloud.gateway.enabled=true/false

2. 核心概念

(1)Route 路由

        网关的基本构建基块。 它由 ID、目标 URI、断言集合和筛选器集合定义。如果聚合断言为 true,则匹配路由。

(2)Predicate 断言

        这是一个Java 8函数断言。输入类型是Spring Framework ServerWebExchange。这允许您匹配HTTP请求中的任何内容,例如标头或参数。

(3)Filter 过滤器

        这些是使用特定工厂构建的GatewayFilter实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。

3. 工作原理

        客户端向 Spring Cloud 网关发出请求。如果网关处理程序映射(Gateway Handler Mapping)确定请求与路由匹配,则会将其发送到网关 Web 处理程序(Gateway Web Handler)。 此处理程序通过特定于请求的过滤器链筛选请求。 过滤器用虚线划分的原因是过滤器可以在发送代理请求之前和之后运行逻辑。 执行所有“预”过滤器逻辑。然后发出代理请求。发出代理请求后,将运行“post”过滤器逻辑。

4. 配置路由断言工厂和网关过滤器工厂

        有两种方法可以配置断言和过滤器:快捷方式和完全展开的参数。下面的大多数示例都使用快捷方式。

(1)快捷方式配置

spring:
  cloud:
    gateway:
      routes:
      - id: after_route  #id 自定义
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue  #键是mycookie 值是mycookievalue

(2)展开方式配置

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

5. 路由断言工厂

        Spring Cloud Gateway将路由匹配为Spring WebFlux基础架构的一部分。 Spring Cloud Gateway 包括许多内置的路由断言工厂。 所有这些断言都匹配 HTTP 请求的不同属性。 可以将多个路由断言工厂与逻辑语句组合在一起。

在yml中加入以下日志配置,可以查看重定向到哪里的日志:

logging:
  level:
    org:
      springframework:
        cloud:
          gateway: trace

 5.1 断言某个时间之后

        在本地80端口启动若依项目,然后配置断言,在配置时间之后的请求,都转发到 http://localhost 上。

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://localhost  
          predicates:
            - After=2021-01-20T17:42:47.789-07:00[America/Denver]

测试结果:

 5.2 断言某个时间之前

在配置的时间之前,才能访问。

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://localhost
          predicates:
            - Before=2021-01-20T17:42:47.789-07:00[America/Denver]

如果不在这个时间前,访问会出现:

把时间改成在当前时间之后,可以正常访问。

            - Before=2023-03-20T17:42:47.789-07:00[America/Denver]

5.3 断言某个时间之间

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://localhost
          predicates:
          - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2024-01-21T17:42:47.789-07:00[America/Denver]

5.4 根据cookie值断言

根据请求标头中cookie的值进行断言

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://localhost
          predicates:
            - Cookie=Idea-b5baabb9, 16077984-579b-44d2-a1a2-92f5837858ef

 5.5 根据请求的标头断言

请求头中包含了这个请求头,且值符合某个规则

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://localhost
          predicates:
            - Header=studentId, \d+  #\d+表示全是数字

全是数字的情况:

 

 如果包含了字母,断言不会通过,访问404:

5.6 根据主机名来断言

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://localhost
          predicates:
            - Host=**.somehost.org,**.anotherhost.org

请求标头中Host值通过断言,即可成功访问

 5.7 根据请求方法来断言

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://localhost
          predicates:
            - Method=GET  #设置只允许GET

GET请求:

 POST请求:

 

 5.8 根据请求路径来断言

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://localhost
          predicates:
            - Path=/red/{segment},/blue/{segment}

 

 5.9 根据查询参数来断言

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://localhost
          predicates:
            - Query=name

 注意

当有两个参数时,必须两个参数都带上,才能请求成功

- Query=name

- Query=id

 

5.10 根据远程用户的IP地址来断言

如果IP地址为192.168.1.1 就会转发到 https://example.org

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
        - RemoteAddr=192.168.1.1/24  #掩码是24位

5.11 根据权重来断言

此路由会将 ~80% 的流量转发给 weighthigh.org,将 ~20% 的流量转发给 weighlow.org

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8  #权重为8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2  #权重为2

6. 网关过滤器工厂

        路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。 路由过滤器的作用域为特定路由。 Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。

对请求头、响应头、请求参数的一些增删改查

6.1 AddRequestHeader 网关过滤器

        增加请求头,可用于请求染色,这个配置会将请求参数 X-Request-zy = blue,加入到请求标头中。

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        - AddRequestHeader=X-Request-zy, blue

6.2 AddRequestParameter 网关过滤器

        增加请求参数

 6.3 AddResponseHeader 网关过滤器

        增加响应头

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: http://localhost
          predicates:
            - Path=/api/{segment}
          filters:
            - AddResponseHeader=X-Response-Red, Blue

 6.4 Spring Cloud Breaker GatewayFilter 过滤器

        Spring Cloud Breaker GatewayFilter 工厂使用 Spring Cloud Breaker API 将网关路由包装在 断路器。Spring Cloud Breaker支持多个可与Spring Cloud Gateway一起使用的库。Spring Cloud 支持开箱即用的 Resilience4J。

在pom.xml中引入依赖:

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

如果出现了异常,就会将请求降级到http://localhost:9994上 

spring:
  cloud:
    gateway:
      routes:
      - id: ingredients
        uri: lb://ingredients
        predicates:
        - Path=//ingredients/**
        filters:
        - name: CircuitBreaker
          args:
            name: fetchIngredients
            fallbackUri: forward:/fallback
      - id: ingredients-fallback
        uri: http://localhost:9994
        predicates:
        - Path=/fallback

6.5 删除重复的响应头过滤器

spring:
  cloud:
    gateway:
      routes:
      - id: dedupe_response_header_route
        uri: https://example.org
        filters:
        - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

6.6 更新请求标头过滤器

这会使用传入 HTTP 请求标头中的更新值将标头添加到下游请求。

spring:
  cloud:
    gateway:
      routes:
      - id: map_request_header_route
        uri: https://example.org
        filters:
        - MapRequestHeader=Blue, X-Request-Red

6.7 前缀路径过滤器

spring:
  cloud:
    gateway:
      routes:
        - id: prefixpath_route
          uri: http://localhost
          predicates:
            - Path=/api/{segment}
          filters:
            - PrefixPath=/mypath

 6.8 删除请求头过滤器

这会在标头发送到下游之前将其删除

spring:
  cloud:
    gateway:
      routes:
      - id: removerequestheader_route
        uri: https://example.org
        filters:
        - RemoveRequestHeader=X-Request-Foo

6.9 删除请求参数过滤器

这将在将参数发送到下游之前将其删除

spring:
  cloud:
    gateway:
      routes:
      - id: removerequestparameter_route
        uri: https://example.org
        filters:
        - RemoveRequestParameter=red

6.10 删除响应头过滤器

这将在将标头返回到网关客户端之前从响应中删除标头。(用于删除敏感信息

spring:
  cloud:
    gateway:
      routes:
      - id: removeresponseheader_route
        uri: https://example.org
        filters:
        - RemoveResponseHeader=X-Response-Foo

6.11 重写路径过滤器

对于请求路径,这会在发出下游请求之前将路径中的api去掉

server:
  port: 8090
spring:
  cloud:
    gateway:
      routes:
        - id: prefixpath_route
          uri: http://localhost
          predicates:
            - Path=/api/{segment}
          filters:
            - RewritePath=/api/?(?<segment>.*), /$\{segment}

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

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

相关文章

Java集合常见面试题(五)

Map 接口 ConcurrentHashMap 的实现原理 JDK 1.7 JDK1.7中的ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成&#xff0c;即ConcurrentHashMap 把哈希桶切分成小数组&#xff08;Segment &#xff09;&#xff0c;每个小数组有 n 个 HashEntry 组成。 其…

贴息贷款政策下,高校建立大数据实验室新思路

高校实验室建设总目标是搭建一站式教学服务平台&#xff0c;一站式教学服务平台概念是在深刻理解高校学科建设及存在的若干问题上提出。围绕着学科建设的各个方面&#xff0c;从专业开设、课程设置、师资培养、教学资源、实验环境、学生实训实习及就业创业等环节&#xff0c;提…

Hive UDF开发

Hive中&#xff0c;除了提供丰富的内置函数&#xff08;见Hive函数大全–完整版(二)&#xff09;之外&#xff0c;还允许用户使用Java开发自定义的UDF函数。 开发自定义UDF函数有两种方式&#xff0c;一个是继承org.apache.hadoop.hive.ql.exec.UDF&#xff0c;另一个是继承or…

windows系统下安装伪分布式Hadoop3.x

1.下载 1.1下载Hadoop3.1.3 官网地址&#xff1a;https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/ 选择hadoop-3.1.3.tar.gz 1.2下载工具集winutils 由于Hadoop不直接支持Windows系统&#xff0c;因此需要使用工具集winutils进行支持。 下载网址&#xff1a;…

can‘t be used as a mixin because it extends a class other than ‘Object‘.

程序员如果敲一会就停半天&#xff0c;抱着一杯茶&#xff0c;表情拧巴&#xff0c;那才是在编程 Flutter 项目开发指导 从基础入门到精通使用目录 前言 - 基础关键字 class&#xff1a;声明一个类&#xff0c;提供具体的成员变量和方法实现。abstract class&#xff1a;声明一…

27.日志技术、XML

目录 一.日志技术 1.1 什么是日志 1.2 目前记录日志的方案 1.3 日志技术的优势 1.4 日志技术体系 1.5 Logback框架 1.5.1 下载地址 1.5.2 模块组成 1.5.3 Logback的使用 二.XML 2.1 XML概述 2.2 XML的特点 2.3 XML文件的使用场景 2.4 XMl文件的创建 2.5 XML的语法…

江瀚新材登陆上交所主板:募资约24亿元,甘书官父子为实际控制人

1月31日&#xff0c;湖北江瀚新材料股份有限公司&#xff08;下称“江瀚新材”&#xff0c;SH:603281&#xff09;在上海证券交易所主板上市。本次上市&#xff0c;江瀚新材公开发行股票66,666,667股&#xff0c;发行价格为35.59元/股&#xff0c;发行市盈率为14.80倍。 按发行…

更高性能表现、更低资源占用,高精度计算数据类型 DecimalV3 揭秘

数值运算是数据库中十分常见的需求&#xff0c;例如计算数量、重量、价格等&#xff0c;为了适应多样化运算场景&#xff0c;数据库系统通常支持精准的数字类型和近似的数字类型&#xff0c;当我们需要精确地表示小数并计算小数时&#xff0c;通常会考虑使用 Decimal 数据类型。…

低代码编程核心技术概念

从技术概念来讲&#xff0c;低代码编程跟通用编程是完全一致的。要利用好低代码编程工具&#xff0c;至少要掌握下面的技术概念。低代码编程核心技术概念一、数据结构这里的数据结构&#xff0c;指一般意义上的数据表和数据字段。 类似于数据库中的表及字段的概念&#xff0c;也…

蓝桥杯2022 A组 python

蓝桥杯2022 A组 python A组相对于B组就五道题不一样 第一题&#xff1a;裁纸刀 就先把四个边剪一下&#xff0c;然后先行后列&#xff0c;蛮简单的 # 20行 横着19刀&#xff0c;竖着21*20 print(1921*204)第三题&#xff1a;质因数个数 这题我感觉就是跟一个约数个数的模板一…

【python】Twisted网络编程

Twisted什么是Twisted&#xff1f;为什么使用twisted&#xff1f;Twisted 写TCP通信基本实例- TCP服务端- TCP客户端Twisted的Deferred机制Why Deferred?Deferred TCP-ECHO客户端实现- TCP client为例&#xff0c;什么是Twisted&#xff1f; Twisted是一种非阻塞的网络服务器…

useEffect 依赖项为对象或数组时,引发不断重渲染问题的原因及解法

转载自 https://www.izhaoo.com/2021/11/01/useEffect-object-dependent/背景今天封了个轮子&#xff0c;对组件传入参数生成对应的动画实例&#xff0c;当入参变化时重新渲染新实例。自然而然想到的就是 useEffect 监听 props 依赖了&#xff0c;如&#xff1a;useEffect(() &…

ESD器件(TVS)选型考虑

参考&#xff1a;TOSHIBA《Basics of ESD Protection (TVS) Diodes》①VRWM: Working peak reverse voltage工作峰值反向电压&#xff1a;ESD保护二极管显示非常高的阻抗。高于这个电压&#xff0c;会通过指定大小漏电流。设计的时候&#xff0c;信号的最大出现电压要在这个电压…

Java基础漏洞(六)

巩固Java基础&#xff0c;基于韩顺平老师的课程&#xff0c;Java的封装、继承、多态、super()、this()、重载与重写的区别......&#xff0c;下面我们一点点来巩固练习。 &#xff08;1&#xff09;继承 继承细节1&#xff1a;子类无法继承父类的私有 图1 我们定义一个父类f…

Ansys Zemax | 利用 TrueFreeForm 面进行网格自由曲面的优化

在这篇文章中&#xff0c;我们将演示如何使用 OpticStudio 的 TrueFreeForm 面&#xff0c;设计AR/VR设备中的人眼追迹系统&#xff08;eye-tracking subsystem&#xff09;&#xff0c;这个系统通常位于装置的楔形透镜结构中。此外&#xff0c;为了完成子孔径&#xff08;sub-…

JSBridge:混合开发中的双向通信[Android、iOSJavaScript]

什么是WebView WebView 是移动端中的一个控件&#xff0c;它为 JS 运行提供了一个沙箱环境。WebView 能够加载指定的 url&#xff0c;拦截页面发出的各种请求等各种页面控制功能&#xff0c;JSB 的实现就依赖于 WebView 暴露的各种接口。 由于历史原因&#xff0c;IOS以8为分界…

【Java AWT 图形界面编程】事件处理机制 ② ( Frame 窗口事件监听器 WindowListener | 代码示例 )

文章目录一、Frame 窗口事件监听器 WindowListener二、Frame 窗口事件监听器 WindowListener 代码示例一、Frame 窗口事件监听器 WindowListener 在 AWT 中 , 为 Frame 窗口 添加 窗口事件监听器 WindowListener , 可以监听窗口的操作 , 如 : 窗口显示 WindowListener#windowO…

leetcode 1626. Best Team With No Conflicts(最佳无冲突团队)

scores数组中是每个队员的得分&#xff0c;ages数组中为对应队员的年龄&#xff0c; 现在要从这个队里挑选出一些队员&#xff0c;使总得分最高&#xff0c; 挑选时年龄大的要比年龄小的score更高&#xff08;严格大于&#xff09;&#xff0c;才不会产生冲突。 返回最高的得分…

【nestjs+VueJs全栈】- 后端搭建和数据库抽离

先补充一些nestjs的前置知识 控制器 控制器负责处理传入的请求和向客户端返回响应。 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常&#xff0c;每个控制器有多个路由&#xff0c;不同的路由可以执行不同的操作。 为了创建一个基本的控制器…

React 组件基础

文章目录1. React 组件的两种创建方式1 使用函数创建组件2 使用类创建组件3 抽离为独立 JS 文件2. React 事件处理1.事件绑定2 事件对象3. 有状态组件和无状态组件4. 组件中的 state 和 setState1 state的基本使用2 setState()修改状态从 JSX 中抽离事件处理程序5.事件绑定 thi…