SpringCloud - 流量控制(一):基于RequestRateLimiterGatewayFilterFactory的限流

写在前面

常用的更平滑的限流算法有两种:漏桶算法和令牌桶算法.
两种限流的算法确有其独到之处,其他实现比如滑动时间窗或者三色速率标记法,其实是“漏桶”与“令牌桶”的变种。要么将“漏桶”容积换成了单位时间,要么是按规则将请求标记颜色进行处理,底层还是“令牌”的思想。

漏桶算法和令牌桶算法的区别

A. 漏桶算法:水(请求)以任意的速度先进入到漏桶里,桶以固定的速度出水,当水流入桶的速度大于水流出的速度,就会直接溢出(拒绝服务),可以看出漏桶算法能强行限制数据的传输速率。
入桶:以任意速率往桶中放入水滴。
出桶:以固定速率从桶中流出水滴。
在这里插入图片描述

B. 令牌桶算法:系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入令牌,如果桶已经满了,令牌就溢出了;如果桶未满,令牌可以累加。当有新的请求时,会拿走一个TOKEN,如果没有TOKEN可以使用了,就会出现阻塞或者拒绝服务。
入桶:以固定速率往桶中放入水滴。
流出:以任意速率从桶中流出水滴。
在这里插入图片描述
令牌桶算法:用于保护服务端,主要用来对调用者频率进行限流,目的是不让服务端被压垮。如果服务端本身有处理能力的时候,如果流量突发(实际消费能力强于配置的流量限制=桶大小),那么实际处理速率可以超过配置的限制(桶大小)。
漏桶算法:用于保护调用方,也就是保护所调用的系统。如果调用的第三方系统本身没有保护机制,或者有流量限制的时候,调用速度不能超过他的限制,由于我们不能更改第三方系统,所以只有在主调方控制。这时即使流量突发也必须舍弃,因为消费能力是第三方决定的。

Spring Cloud Gateway的限流

Spring Cloud Gateway 官方提供了 RequestRateLimiterGatewayFilterFactory 过滤器工厂,使用 REDIS 和 LUA 脚本实现了令牌桶的方式。限流规则由KeyResolver接口的具体实现类来决定,常用的规则有:IP、URL、参数等等来进行限流。
官方文档

如何使用

① 添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
② 修改/增加配置
在GATEWAY的.YML文件中进行如下配置(主要是REDIS和RequestRateLimiter):
spring:
  redis:
    host: localhost
    port: 6379
    password: 
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        # 系统模块
        - id: servicex-system
          uri: lb://servicex-system
          predicates:
            - Path=/system/**
          filters:
            - StripPrefix=1
            # 稳定速率是通过把replenishRate(补充令牌速度)和burstCapacity(令牌桶容量)设置为相同的值来实现的;
            # 可通过设置burstCapacity高于replenishRate来允许临时突发流量。在这种情况下,限流器需要在两次突发请求之间留出一段时间(根据replenishRate),因为连续两次突发将导致请求丢失(HTTP 429 - Too Many Requests).
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 1     # 令牌桶每秒填充速率, 指的是允许用户每秒执行多少请求,不丢弃任何请求;
                redis-rate-limiter.burstCapacity: 5     # 令牌桶总容量, 指的是用户在一秒钟内允许执行的最大请求数,也就是令牌桶可以保存的令牌数, 如果将此值设置为零将阻止所有请求;
                redis-rate-limiter.requestedTokens: 1   # 指的是每个请求消耗多少个令牌, 默认是1.
                key-resolver: "#{@pathKeyResolver}"     # 指的是限流的时候以什么维度来判断,使用SpEL表达式按名称引用BEAN(REDIS中限流相关的KEY和此处的配置相关).
        # 文件服务
        - id: servicex-file
          uri: lb://servicex-file
          predicates:
            - Path=/file/**
          filters:
            - StripPrefix=1
# 不校验白名单
ignore:
  whites:
    - /auth/logout
    - /auth/login
    - /*/v2/api-docs
    - /csrf
③ 定义限流维度
1. 多个限流维度, 需要使用@Primary指定;
2. 在配置文件中指定的限流维度的名字来自该文件,key-resolver: "#{@pathKeyResolver}"@Configuration
public class KeyResolverConfiguration {

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

    @Bean
    public KeyResolver parameterKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getHeaders().get("username").get(0));
    }

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

在REDIS的DB0数据库中会生成两个KEY,它们的TTL都很短,分别为:
request_rate_limiter.{限流维度名字}.tokens
request_rate_limiter.{限流维度名字}.timestamp

⑤ 使用SWAGGER测试

在这里插入图片描述

如何封装429状态码?

问题:我们的代码如何捕获429状态码并进行封装呢?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: ork.cloud:spring-cloud-starter-openfeign:jar是一个基于Spring Cloud的开源库,用于简化微服务架构中服务之间的调用和通信。 OpenFeign是一个声明式的Web服务客户端,它简化了编写HTTP请求的代码,使得服务间调用更加简单和高效。它是Spring Cloud提供的一个集成了Ribbon和Hystrix的库,可以方便地与其他微服务组件集成使用。 使用OpenFeign,我们可以通过编写接口的方式来定义服务间的调用,而不需要关注底层的HTTP请求。通过注解配置,OpenFeign会自动根据接口定义生成对应的代理类,并且提供了负载均衡、断路器等功能,方便处理高并发和服务故障的情况。 在微服务架构中,服务之间的调用是非常频繁的,而且随着微服务的增多,手动编写HTTP请求的代码会变得非常繁琐和容易出错。使用OpenFeign可以大大简化服务之间的调用流程,提高开发效率和代码质量。 总结来说,ork.cloud:spring-cloud-starter-openfeign:jar是一个方便而强大的库,可以帮助我们简化微服务架构中服务之间的调用和通信,并且提供了负载均衡和断路器等功能,能够提高系统的可靠性和性能。 ### 回答2: ork.cloud:spring-cloud-starter-openfeign:jar是一个基于Spring Cloud的开源项目,它提供了一种方便的编写和调用RESTful服务的方式。Feign是一个声明式的Web服务客户端,它可以简化HTTP请求的处理和封装,使得开发者可以更加专注于业务逻辑的编写。 使用Spring Cloud Starter OpenFeign可以快速地编写和调用其他微服务。它通过注解的方式将HTTP请求映射到对应的方法上,自动进行了服务的发现和负载均衡。 Feign支持多种请求方式,包括GET、POST、PUT、DELETE等,还可以使用@PathVariable、@RequestParam等注解处理路径参数和查询参数。Feign还支持对请求体进行处理,可以将请求体转换成Java对象,方便业务逻辑的处理。 在使用Feign时,不需要手动编写HTTP请求的代码,只需要定义一个接口并使用Feign的注解进行标记即可。Feign会根据注解生成代理对象来完成请求的发送和接收。这样可以大大简化开发的工作量,并且使得代码更加清晰易读。 Spring Cloud Starter OpenFeign还集成了Ribbon和Hystrix,这使得我们在使用Feign时可以实现负载均衡和熔断的功能。即使请求的目标服务发生宕机或故障,也能够保证系统的高可用性和稳定性。 总之,Spring Cloud Starter OpenFeign是一个非常实用和方便的工具,可以简化微服务架构下的服务调用,并提供了负载均衡和熔断等功能。它的使用可以加快开发速度,提高系统的可靠性和稳定性。 ### 回答3: spring-cloud-starter-openfeign是一个开源的Spring Cloud组件,用于简化在微服务架构中进行远程服务调用的过程。它基于Netflix的Feign库进行开发,提供了一种声明式的、基于接口的远程服务调用方式,可以方便地实现服务之间的通信和数据交互。 ork.cloud:spring-cloud-starter-openfeign:jar是spring-cloud-starter-openfeign组件的一个特定版本的jar包。在使用Spring Boot构建的项目中,可以通过引入这个jar包来集成并使用spring-cloud-starter-openfeign组件,从而简化远程服务调用的代码编写和配置。 使用spring-cloud-starter-openfeign,我们只需要定义一个接口,通过注解的方式声明远程服务的地址和调用方法,然后在需要调用远程服务的地方直接调用这个接口的方法即可。Spring Cloud会根据注解信息自动进行服务发现和负载均衡,将我们的调用请求转发到对应的服务实例上。 该jar包中除了包含spring-cloud-starter-openfeign的核心功能外,还可能包含一些额外的依赖库或工具,以及特定版本的相关代码和配置文件。通过引入这个jar包,我们可以一键集成和启用spring-cloud-starter-openfeign组件,省去了手动添加依赖和配置的步骤,能够更快速地搭建起微服务架构中的服务调用机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值