• 27.gateway的限流实战(springcloud)


    1 什么是限流
    通俗的说,限流就是 限制一段时间内,用户访问资源的次数 ,减轻服务器压力,限流大致分为两种:
    1. IP 限流(5s 内同一个 ip 访问超过 3 次,则限制不让访问,过一段时间才可继续访问)
    2. 请求量限流(只要在一段时间内(窗口期),请求次数达到阀值,就直接拒绝后面来的访问了,过一段时间才可以继续访问)(粒度可以细化到一个 api(url),一个服务)
    2 本次限流模型
    限流模型 : 漏斗算法 ,令牌桶算法,窗口滑动算法 计数器算法
    入不敷出
    1)、所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;
    2)、根据限流大小,设置按照一定的 速率 往桶里添加令牌;
    3)、 桶设置最大的放置令牌限制 ,当桶满时、新添加的令牌就被丢弃或者拒绝;
    4)、请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其他的业务逻辑,处理完业务逻辑之后,将令牌直接删除;
    5)、令牌桶有最低限额,当桶中的令牌达到最低限额的时候,请求处理完之后将不会删除令牌,以此保证足够的限流;
    3 Gateway 结合 redis 实现请求量限流
    Spring Cloud Gateway 已经内置了一个 RequestRateLimiterGatewayFilterFactory,我们可以直接使用。
    目前 RequestRateLimiterGatewayFilterFactory 的实现依赖于 Redis,所以我们还要引入spring-boot-starter-data-redis-reactive。
    3.1 添加依赖
    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-data-redis-reactiveartifactId>
    4. dependency>
    3.2 修改配置文件

     

     

    3.3 配置文件说明
    在上面的配置文件,配置了 redis 的信息,并配置了 RequestRateLimiter 的限流过滤器,该过滤器需要配置三个参数:
    burstCapacity:令牌桶总容量。
    replenishRate:令牌桶每秒填充平均速率。
    key-resolver:用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据

     3.4 创建配置类 RequestRateLimiterConfig

    1. @Configuration
    2. public class RequestRateLimiterConfig {
    3. /**
    4. * IP 限流
    5. * 把用户的 IP 作为限流的 Key
    6. *
    7. * @return
    8. */
    9. @Bean
    10. @Primary
    11. public KeyResolver hostAddrKeyResolver() {
    12. return (exchange) -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
    13. }
    14. /**
    15. * 用户 id 限流
    16. * 把用户 ID 作为限流的 key
    17. *
    18. * @return
    19. */
    20. @Bean
    21. public KeyResolver userKeyResolver() {
    22. return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
    23. }
    24. /**
    25. * 请求接口限流
    26. * 把请求的路径作为限流 key
    27. *
    28. * @return
    29. */
    30. @Bean
    31. public KeyResolver apiKeyResolver() {
    32. return exchange -> Mono.just(exchange.getRequest().getPath().value());
    33. }
    34. }
    3.5 启动快速访问测试
    http://localhost/info?token=asdad 快速访问后报 429

    查看 redis

     

     

  • 相关阅读:
    Minecraft 1.16.5模组开发(五十四) 方块探测器(Detector)
    1045 Favorite Color Stripe
    Hive3 on Spark3配置
    处理乱码的问题oracle字符集WE8MSWIN1252和WE8ISO8859P1
    zynq:我将ov5640转灰度图例程的rgb2ycbcr ip核加入到ov7725 lcd显示例程的原理图进行上板测试,但是lcd屏里显示的是未经灰度转换的图像,这是为什么啊
    C杂讲 结构体对齐
    【JavaScript】时间日期:Date对象
    MATLAB 状态空间设计 —— LQG/LQR 和极点配置算法
    极速Go语言入门(超全超详细)-基础篇
    SpringBoot 定时任务:@EnableScheduling @Scheduled
  • 原文地址:https://blog.csdn.net/weixin_59334478/article/details/127894925