• Spring Cloud Gateway 网关限流


    前言:

    已经通过案例实现了通过 Spring Cloud Gateway 网关调用服务 API,并已经了解了 Gateway 网关的几个核心概念: routes , predicates , filters 。

    这几个核心概念串起来就是 Gateway 的执行流程:客户端发请求,通过断言 predicates 进行匹配,若匹配上了则请求就会被发送到网关处理程序,并执行特定的请求过滤器链 fliters 。

    Spring Cloud Gateway提供了多种断言 predicate 工厂和过滤器 filter 工厂,也可以自定义断言工厂和过滤器工厂。

    本文将使用以下两种方式实现网关的限流:

    • 使用 Spring Cloud Gateway 的 RequestRateLimiter 过滤器工厂基于 Redis 的限流,
    • 使用 Sentinel 结合 Spring Cloud Gateway 来实现网关限流。

    使用 RequestRateLimiter 过滤器工厂结合 Redis 实现网关限流

    RequestRateLimiter GatewayFilter 工厂使用实现 RateLimiter 的限流器来确定当前请求是否被限流。如果被限流了,则默认返回 HTTP 429 - Too Many Requests 状态。

    RequestRateLimiter 网关过滤器工厂采用可选的 keyResolver 参数和特定于速率限制器的参数。

    KeyResolver在源码中的定义:

    public interface KeyResolver {
    	Mono resolve(ServerWebExchange exchange);
    }
    复制代码

    我们可以通过 KeyResolver 来指定限流的 key ,比如可以根据用户做限流,也可以根据 IP 来做限流,或者根据接口进行限流。

    基于 Redis 的限流器

    目前限流器的实现提供了基于 Redis 的实现,其使用的算法是 令牌桶算法 。

    基于 Redis 的限流,需要引入 spring-boot-starter-data-redis-reactive 依赖:

    
        org.springframework.boot
        spring-boot-starter-data-redis-reactive
    
    复制代码

    要实现限流,需要配置 Redis 连接以及在配置网关路由的时候添加 RequestRateLimiter 过滤器:

    spring:
      redis:
        host: 192.168.242.112
        port: 16397
        password: s1lcA6;.7Lx9,x
      cloud:
        gateway:
          routes:
          - id: order-service
            uri: lb://order-service
            filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
                key-resolver: "#{@userKeyResolver}"
    复制代码

  • 相关阅读:
    【JAVA-2】第二章 Java基本语法01:变量与运算符
    基于JAVA-英杰学堂网上教学平台-计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    [计算机网络]网络基础
    Oracle VM VirtualBox安装CentOS 7系统
    Java 中的 Cloneable 接口和深拷贝
    【Java】Java中对List进行排序
    让Unity打包AssetBundle更轻松
    8K HDR!|为 Chromium 实现 HEVC 硬解 - 原理/实测指南
    让古迹“活”起来!荣耀的软人文和硬科技
    力扣代码学习日记八
  • 原文地址:https://blog.csdn.net/JHIII/article/details/126542533