SpringCloudGateway网关实战(二)

news2025/1/19 14:27:11

SpringCloudGateway网关实战(二)

本文我们在前文的基础上,开始讲gateway过滤器的部分内容。gateway的过滤器分为内置过滤器Filter和全局过滤器GlobalFilter。本章节先讲内置过滤器Filter。

需要先声明一下内置过滤器和全局过滤器之间的区别:

  • 内置过滤器是针对特定路由定义的,只在匹配到该路由的请求上运行。
  • 全局过滤器是应用于所有路由的通用过滤器,无需为每个路由单独配置。

通常情况下,会根据路由的具体需求选择并配置不同的内置过滤器来完成特定的功能。如果有一些通用的过滤逻辑需要应用到所有的请求上,可以选择使用全局过滤器来实现。

内置过滤器Filter

内置过滤器其实挺多的,这里挑一些常用的说一下:

  1. StripPrefix:去除请求的前缀。
  2. RewritePath:重写请求的路径。
  3. RateLimiter:限流过滤器,用于控制请求的速率。
  4. Retry:对请求进行重试。
  5. AddRequestHeader:用于添加请求头。
  6. AddResponseHeader:在响应头中添加指定的键值对。
  7. SetRequestHeader:设置请求头的值。
  8. SetResponseHeader:设置响应头的值。
  9. AddRequestParameter:添加请求参数。
  10. RemoveRequestHeader:移除请求头。
  11. RemoveResponseHeader:移除响应头。
  12. Hystrix:将请求包裹在Hystrix断路器中,提供服务容错能力。

1.StripPrefix

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
          filters:
            - StripPrefix=1

这个是最常用的过滤器,作用是过滤掉url中前n节,比如我们发送请求:

localhost:8080/system-api/system/user/info

此时因为我们配置了StripPrefix=1,实际请求的地址就变成:

localhost:8080/system/user/info

2.RewritePath

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
		 filters:
		   - StripPrefix=1
            - RewritePath=/system/(?<segment>.*), /$\{segment}

具体的重写规则为将 “/system/xxx” 重写为 “/xxx”,其中 xxx 是根据正则表达式捕获的片段(segment)。

比如发起请求:

localhost:8080/system-api/system/user/info

那么该请求就会请求到:

localhost:8080/user/info

3.RateLimiter

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
          filters:
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                key-resolver: "#{@remoteAddrKeyResolver}" # 使用 SpEL 表达式按名称引用 bean
                redis-rate-limiter.replenishRate: 10 # 令牌桶每秒填充速率
                redis-rate-limiter.burstCapacity: 20 # 令牌桶总容量

在上面的示例中,我们使用了 name: RequestRateLimiter 来指定使用 RateLimiter 过滤器,并通过 args 属性来设置 RateLimiter 过滤器的参数。

在这个示例中,我们设置了以下参数:

  • key-resolver: "#{@remoteAddrKeyResolver}":用于指定从请求中提取限流键的解析器。你可以自定义一个实现了 KeyResolver 接口的 Bean,并在此处引用它。
  • redis-rate-limiter.replenishRate: 10:限流桶每秒填充的令牌数为 10。
  • redis-rate-limiter.burstCapacity: 20:限流桶的容量为 20。

由于这个限流过滤器是使用Redis进行实现的,所以我们需要引入对应的Redis依赖,并配置对应的Redis配置。

引入依赖:

        <!--Redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!--RateLimiter-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>

添加Redis配置:

spring:
  redis:
    host: localhost                # Redis 主机名
    port: 6379                     # Redis 端口号
    password: 123456             # Redis 密码(如果有的话)
    timeout: 2000                  # 连接超时时间(毫秒)

对应的KeyResolver配置类:

@Configuration
public class KeyResolverConfiguration {

    @Primary
    @Bean
    public KeyResolver remoteAddrKeyResolver() {
        return exchange -> Mono
                .just(Objects.requireNonNull(Objects.requireNonNull(exchange.getRequest().getRemoteAddress()))
                        .getAddress().getHostAddress());
    }

    @Bean
    public KeyResolver pathKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getURI().getPath());
    }

    @Bean
    public KeyResolver ipKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getURI().getHost());
    }

}

这样,我们启动应用,进行压力测试:

image-20230905230718282

这里我们可以看到,我们进行了5秒压测,由于我们的配置:

                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20

所以令牌桶中初始有20个令牌,而每秒钟10个令牌的速率重新填充。我们压测进行了5秒,因此结果有20+5*10=70个请求请求成功,理论与我们的压测结果达到了一致。

4.Retry

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
          filters:
            - StripPrefix=1
            - name: Retry
              args:
                retries: 3
                statuses: BAD_GATEWAY,INTERNAL_SERVER_ERROR
                methods: GET,POST
                series: SERVER_ERROR

如上图示例,我们使用了 name: Retry 来指定使用 Retry 过滤器,并通过 args 属性来设置 Retry 过滤器的参数。在这个示例中,我们设置了以下参数:

  • retries: 3:最大重试次数为 3。
  • statuses: BAD_GATEWAY,INTERNAL_SERVER_ERROR:当响应状态码为 BAD_GATEWAYINTERNAL_SERVER_ERROR 时触发重试。取值参考:org.springframework.http.HttpStatus
  • methods: GET,POST:只对 GET 和 POST 请求方法进行重试。取值参考:org.springframework.http.HttpMethod
  • series: SERVER_ERROR:只对服务器错误类别的响应进行重试(即状态码以 5 开头的响应)。org.springframework.http.HttpStatus.Series

5.AddRequestHeader

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
          filters:
            - StripPrefix=1
            - AddRequestHeader=X-Example-Header, example-value

在上述示例中,AddRequestHeader过滤器将在请求的头部中添加一个名为X-Example-Header的字段,并设置其值为example-value。通过这种方式,当请求被转发到目标服务时,就会携带额外的请求头信息。后续的服务可以读取这些请求头并进行相应的处理。

6.AddResponseHeader

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
          filters:
            - StripPrefix=1
            - AddResponseHeader=X-Example-Header, example-value

在上述示例中,AddResponseHeader过滤器会在响应的头部中添加一个名为X-Example-Header的字段,并设置其值为example-value。通过这种方式,目标服务返回的响应会携带额外的响应头信息。

7.SetRequestHeader

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
          filters:
            - StripPrefix=1
            - SetRequestHeader=X-Custom-Header, custom-value

在上述示例中,当匹配成功时,会使用 SetRequestHeader 过滤器来设置请求头X-Custom-Header,并指定其值为 custom-value

8.SetResponseHeader

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
          filters:
            - StripPrefix=1
            - SetResponseHeader=X-Custom-Header, custom-value

在上述示例中,当匹配成功时,会使用 SetResponseHeader 过滤器来设置响应头X-Custom-Header,并指定其值为 custom-value

9.AddRequestParameter

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
          filters:
            - StripPrefix=1
            - AddRequestParameter=apiKey,my-value

在上面的例子中,我们使用AddRequestParameter过滤器并提供了两个参数:

  • apiKey:要添加的请求参数的名称。
  • my-value:要添加的请求参数的值。

通过这个配置,当请求匹配时,将会自动添加一个名为apiKey,值为my-value的请求参数。

10.RemoveRequestHeader

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
          filters:
            - StripPrefix=1
            - name: RemoveRequestHeader
              args:
                name: X-Auth-Token

上面示例中,我们使用了 name: RemoveRequestHeader 来指定使用 RemoveRequestHeader 过滤器。通过 args 属性来设置 RemoveRequestHeader 过滤器的参数。

在这个示例中,我们设置了以下参数:

  • name: X-Auth-Token:要移除的请求头的名称。

这样配置之后,当请求匹配时,将会自动移除请求中的 X-Auth-Token 请求头,并将修改后的请求继续传递给对应服务。

11.RemoveResponseHeader

spring:
  cloud:
    gateway:
      routes:
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system-api/**
          filters:
            - StripPrefix=1
            - name: RemoveResponseHeader
              args:
                name: X-Custom-Header

上面例子中,我们使用了 name: RemoveResponseHeader 来指定使用 RemoveResponseHeader 过滤器。通过 args 属性来设置 RemoveResponseHeader 过滤器的参数。

在这个示例中,我们设置了以下参数:

  • name: X-Custom-Header:要移除的响应头的名称。

这样配置之后,当请求匹配时,将会自动移除响应中的 X-Custom-Header 响应头,并将修改后的响应返回给客户端。

12.Hystrix

这部分有点特殊,在3.1.8版本的spring-cloud-starter-gateway中,Hystrix这个Filter已经被正式移除了,这之后更加倾向于单独使用Hystrix而不是在gateway中的Hystrix

如果你想要按照:

          filters:
            - name: Hystrix
              args:
                name: fallbackcmd
                fallbackUri: forward:/fallback

这样的形式尝试使用Hystrix,那么就会报错Unable to find GatewayFilterFactory with name hystrix

另外使用Hystrix我们后面再讲。

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

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

相关文章

mysql文档--innodb中的重头戏--事务隔离级别!!!!--举例学习--现象演示

阿丹&#xff1a; 先要说明一点就是在网上现在查找的mysql中的事务隔离级别其实都是在innodb中的事务隔离级别。因为在mysql的5.5.5版本后myisam被innodb打败&#xff0c;从此innodb成为了mysql中的默认存储引擎。所以在网上查找的事务隔离级别基本上都是innodb的。并且支持事务…

JavaScript基础10——获取数据类型、类型转换

哈喽&#xff0c;大家好&#xff0c;我是雷工。 现如今知识大爆炸&#xff0c;到处都有海量的知识&#xff0c;常常见了就收藏&#xff0c;把网盘塞得满满的&#xff0c;却从来没有看过。 收藏起来装到网盘里并没有什么软用&#xff0c;要把知识装到脑袋里才行。 从几分钟开始&…

【LeetCode-中等题】26. 删除有序数组中的重复项

文章目录 题目方法一&#xff1a;快慢指针 题目 方法一&#xff1a;快慢指针 class Solution { //快慢指针public int removeDuplicates(int[] nums) {int fast 1;int slow 0;while(fast < nums.length){if(nums[fast] nums[fast-1]) fast;//若当前元素和之前元素相同 则…

华为OD机试 - 战场索敌 - 深度优先搜索dfs算法(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、深度优先搜索dfs五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明4、如果增加目标敌人数量K为55、来&#xff0c;上强度 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 有一个大小是N*M…

ros_launch配置

创建launch文件批运行节点和包 将以下四条指令写入launch文件中 获取软件包的完整指令 rospackpkg&#xff1a;软件包名字 type&#xff1a;节点名字 四条指令转化成launch文件

无人机航线规划

无人机航线规划&#xff0c;对于无人机的任务执行有着至关重要的作用&#xff0c;无人机在从起点飞向目的点的过程中&#xff0c;如何规划出一条安全路径&#xff0c;并且保证该路径代价最优&#xff0c;是无人机航线规划的主要目的。其中路径最优的含义是&#xff0c;在无人机…

大数据-玩转数据-Flink 容错机制

一、概述 在分布式架构中&#xff0c;当某个节点出现故障&#xff0c;其他节点基本不受影响。在 Flink 中&#xff0c;有一套完整的容错机制&#xff0c;最重要就是检查点&#xff08;checkpoint&#xff09;。 二、检查点&#xff08;Checkpoint&#xff09; 在流处理中&am…

初识Nacos

前言 Nacos是一个用于微服务架构下的服务发现和配置管理以及服务管理的综合解决方案&#xff08;官网介绍&#xff09;&#xff0c;这里的服务发现其实就是注册中心&#xff0c;配置管理就是配置中心&#xff0c;而服务管理是二者的综合&#xff1b; Nacos特性 1.服务发现与…

《Go语言在微服务中的崛起:为什么Go是下一个后端之星?》

&#x1f337;&#x1f341; 博主猫头虎&#x1f405;&#x1f43e; 带您进入 Golang 语言的新世界✨✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f…

【JavaEE】_CSS常用属性值

目录 1. 字体属性 1.1 设置字体家族 font-family 1.2 设置字体大小 font-size 1.3 设置字体粗细 font-weight 1.4 设置字体倾斜 font-style 2. 文本属性 2.1 设置文本颜色 color 2.2 文本对齐 text-align 2.3 文本装饰 text-decoration 2.4 文本缩进 text-indent 2.…

车载软件架构——基础软件供应商开发工具链(二)

车载软件架构——基础软件供应商&开发工具链(二) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己…

2023-9-10 能被整除的数

题目链接&#xff1a;能被整除的数 #include <iostream> #include <algorithm>using namespace std;typedef long long LL;const int N 20;int n, m; int p[N];int main() {cin >> n >> m;for(int i 0; i < m; i) cin >> p[i];int res 0;f…

性能测试 —— 全链路压测最佳实践!

全链路压测理论基础 什么是全链路压测 基于实际的生产业务场景、系统环境&#xff0c;基于真实数据模拟海量的用户请求对整个业务链进行压力测试&#xff0c;并持续调优的过程&#xff1b; 全链路的核心为&#xff1a;业务场景、数据链路、压力模型和环境拓扑&#xff1b;…

QuantLib学习笔记——看看几何布朗运动有没有股票走势的感觉

⭐️ 小鹿在乱撞 小伙伴们肯定看过股票的走势&#xff0c;真是上蹿下跳啊&#xff0c;最近小编学了一丢丢关于随机过程和QuantLib的知识&#xff0c;想利用随机过程生成一个类似股票价格走势的图&#xff0c;安排&#xff01;&#xff01;&#xff01; ⭐️ 随机过程 随机过程…

基于seata实现分布式事务实现订单服务 + 账户服务 + 商品库存服务之间的分布式事务

概述 实现订单服务 账户服务 商品库存服务之间的分布式事务. 订单服务生成订单,同时调用账户服务扣减金额, 调用库存服务扣减库存. 服务采用seata的刚性事务, 保证数据一致性. 详细 1.需求&#xff08;要做什么&#xff09; 模仿一个购物流程. 利用seata的分布式事务实现 …

【数据结构】栈、队列和数组

栈、队列和数组 栈队列数组数组的顺序表示和实现顺序表中查找和修改数组元素 矩阵的压缩存储特殊矩阵稀疏矩阵 栈 初始化 #define MaxSize 50//栈中元素的最大个数 typedef char ElemType;//数据结构 typedef struct{int top;//栈顶指针ElemType data[MaxSize];//存放栈中的元…

MySQL无法查看系统默认字符集以及校验规则

show variables like character_set_database; show variables like collation_database;这个错误信息表示MySQL在尝试访问performance_schema.session_variables表时&#xff0c;发现该表不存在。这个问题可能是由于MySQL的版本升级导致的。解决这个问题的一种方法是运行mysql…

[管理与领导-81]:IT基层管理者 - 核心技能 - 高效执行力 - 6- 两大思维:服务思维、重点思维、高效与快速的区别?

目录 前言&#xff1a; 一、服务思维 二、重点思维 三、高效与快速的区别 补充&#xff1a;执行人才的表现 前言&#xff1a; 在某种程度上&#xff0c;高效与完美是相互制约的&#xff0c;要想高效&#xff0c;大多数时候&#xff0c;会牺牲一部分完美&#xff0c;而要达…

Pandas 掉包侠刷题实战--条件筛选

本博文内容为力扣刷题过程的记录&#xff0c;所有题目来源于力扣。 题目链接&#xff1a;https://leetcode.cn/studyplan/30-days-of-pandas/ 文章目录 准备工作1. isin(values) 和 ~2. df.drop_duplicates()3. df.sort_values()4. df.rename()5. pd.merge() 题目-条件筛选1. 大…

postgresql-窗口函数种类

postgresql-聚合窗口函数 聚合函数排名窗口函数案例1案例2 取值窗口函数环比增长率同比增长率 聚合函数 常用的聚合函数&#xff0c;例如 AVG、SUM、COUNT 等&#xff0c;也可以作为窗口函数使用 --计算移动平均值 select saledate, amount, avg(amount) over (order by sale…