【Spring Cloud】网关Gateway的请求过滤工厂RequestRateLimiterGatewayFilterFactory

概念

关于微服务网关Gateway中有几十种过滤工厂,这一篇博文记录的是关于请求限流过滤工厂,也就是标题中的RequestRateLimiterGatewayFilterFactory。这个路由过滤工厂是用来判断当前请求是否应该被处理,如果不会被处理就会返回HTTP状态码为429的code。接下来构建两个模块,其中一个是服务模块,一个是网关模块来测试关于请求过滤工厂是否生效。

服务

引入依赖

XML 复制代码
<dependencies>
    <!-- 由于仅是测试 于是无需多引入微服务相关依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

修改yml配置

java 复制代码
server:
  port: 8081

spring:
  application:
    name: cloud-demo

接口路径

java 复制代码
@RestController
@RequestMapping("/filter")
public class RateLimiterFilterController {

    @GetMapping("/requestRateLimiter")
    public String requestRateLimiter() {
        return "进入了限流方法";
    }

}

网关

引入依赖

XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 网关 需要注意的是网关中不要引入spring-boot-starter-web 否则启动报错 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>
<!-- Redis RateLimiter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

修改yml配置

XML 复制代码
server:
  port: 8080

spring:
  application:
    name: cloud-gateway
  redis:
    host: IP
    port: 端口
    password: 密码
  cloud:
    gateway:
      routes:
        - id: request-rate-limiter-route
          uri: http://127.0.0.1:8081
          predicates:
            - Path=/filter/requestRateLimiter/**
          filters:
            # 需要注意的是Redis要在5.x以上才会生效 并且有密码情况下需要配置正确
            - name: RequestRateLimiter
              args:
                # 对应的限流路由判断
                key-resolver: "#{@userKeyResolver}"
                # 每秒生成的令牌数
                redis-rate-limiter.replenishRate: 2
                # 高并发情况下将每秒生成的令牌数增加的个数 即 replenishRate + burstCapacity
                redis-rate-limiter.burstCapacity: 2
                # 每个请求消耗的令牌个数
                redis-rate-limiter.requestedTokens: 2

接口

java 复制代码
@Configuration
public class FilterConfig {

    @Bean
    public KeyResolver userKeyResolver() {
        // getFirst()是获取MultiValueMap中的第一个key中的值 因为这个MultiValueMap不会产生key冲突导致value覆盖的问题
        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
    }

}

测试

输入:http://localhost:8080/filter/requestRateLimiter是无法访问的。因为在FilterConfig配置类中配置了userKeyResolver这个组件,所以需要在路径上添加user参数。

输入:http://localhost:8080/filter/requestRateLimiter?user=xxx可以正常访问的,但是把刷新的速率加快,直接报了以下的错误,如果没有报错也没有显示文本的,F12也可以看到路径429错误码,这就是一开始所说的请求过多此过滤工厂会报429HTTP状态码的问题。

当然,既然这个过滤工厂需要配置Redis,那么就一定会需要在Redis中存储数据。打开Redis可视化工具可以发现,因为我没有指定存储的库,所以默认在0数据库中,会被存储两个值。

一个为request_rate_limiter.(user名称).timestamp,另一个为request_rate_limiter.(user名称).tokens。这之后就是涉及到源码的阅读,本篇博文并不会介绍源码,但后续会更新自定义路由过滤工厂。

相关推荐
mldong1 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
tqs_123452 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
逆境不可逃2 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
weixin_BYSJ19873 小时前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
Flynt3 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet3 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
星云API技术支持3 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
niucloud-admin4 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
海宇AI5 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化
cfm_29146 小时前
单例模式详解
java