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


    概念

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

    服务

    引入依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.bootgroupId>
    4. <artifactId>spring-boot-starter-webartifactId>
    5. dependency>
    6. dependencies>

    修改yml配置

    1. server:
    2. port: 8081
    3. spring:
    4. application:
    5. name: cloud-demo

    接口路径

    1. @RestController
    2. @RequestMapping("/filter")
    3. public class RateLimiterFilterController {
    4. @GetMapping("/requestRateLimiter")
    5. public String requestRateLimiter() {
    6. return "进入了限流方法";
    7. }
    8. }

    网关

    引入依赖

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starterartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.springframework.cloudgroupId>
    7. <artifactId>spring-cloud-starter-gatewayartifactId>
    8. <version>2.2.0.RELEASEversion>
    9. dependency>
    10. <dependency>
    11. <groupId>org.springframework.bootgroupId>
    12. <artifactId>spring-boot-starter-data-redis-reactiveartifactId>
    13. dependency>

    修改yml配置

    1. server:
    2. port: 8080
    3. spring:
    4. application:
    5. name: cloud-gateway
    6. redis:
    7. host: IP
    8. port: 端口
    9. password: 密码
    10. cloud:
    11. gateway:
    12. routes:
    13. - id: request-rate-limiter-route
    14. uri: http://127.0.0.1:8081
    15. predicates:
    16. - Path=/filter/requestRateLimiter/**
    17. filters:
    18. # 需要注意的是Redis要在5.x以上才会生效 并且有密码情况下需要配置正确
    19. - name: RequestRateLimiter
    20. args:
    21. # 对应的限流路由判断
    22. key-resolver: "#{@userKeyResolver}"
    23. # 每秒生成的令牌数
    24. redis-rate-limiter.replenishRate: 2
    25. # 高并发情况下将每秒生成的令牌数增加的个数 即 replenishRate + burstCapacity
    26. redis-rate-limiter.burstCapacity: 2
    27. # 每个请求消耗的令牌个数
    28. redis-rate-limiter.requestedTokens: 2

    接口

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

    测试

            输入: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。这之后就是涉及到源码的阅读,本篇博文并不会介绍源码,但后续会更新自定义路由过滤工厂。

  • 相关阅读:
    【在线编程-Python篇】Python入门 04 列表(下)
    工作中我们应该具备的能力
    华为云IOT平台设备获取api调用笔记
    Centos 6.5 升级到Centos7指导手册
    产品软文怎么写?掌握这几个技巧你也能写
    数据库系统原理与应用教程(007)—— 数据库相关概念
    NIO Channel(通道)类
    Mysql索引失效的几种情况总结
    java和python刷题的一些语法规则总结(未完成)
    【SQL笔记】四、使用函数处理数据
  • 原文地址:https://blog.csdn.net/m0_65563175/article/details/133856373