500m主机空间能做视频网站吗,wordpress 主题库,湖南微信网站,知名企业名字RequestRateLimiter
RequestRateLimiter GatewayFilter 工厂使用 RateLimiter 实现来确定是否允许当前请求继续进行。如果不允许#xff0c;就会返回 HTTP 429 - Too Many Requests#xff08;默认#xff09;的状态。
这个过滤器需要一个可选的 keyResolver 参数和特定于…RequestRateLimiter
RequestRateLimiter GatewayFilter 工厂使用 RateLimiter 实现来确定是否允许当前请求继续进行。如果不允许就会返回 HTTP 429 - Too Many Requests默认的状态。
这个过滤器需要一个可选的 keyResolver 参数和特定于速率限制器的参数。
keyResolver 是一个实现了 KeyResolver 接口的Bean。在配置中使用SpEL来引用Bean的名字。#{myKeyResolver} 是一个SpEL表达式它引用了一个名为 myKeyResolver 的bean。下面的列表显示了 KeyResolver 的接口。
Example 42. KeyResolver.java
public interface KeyResolver {MonoString resolve(ServerWebExchange exchange);
}KeyResolver 接口让可插拔的策略导出限制请求的key。在未来的里程碑版本中会有一些 KeyResolver 的实现。
KeyResolver 的默认实现是 PrincipalNameKeyResolver它从 ServerWebExchange 中检索 Principal 并调用 Principal.getName()。
默认情况下如果 KeyResolver 没有找到一个 key请求会被拒绝。你可以通过设置 spring.cloud.gateway.filter.request-rate-limiter.deny-empty-keytrue 或 false和 spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code 属性来调整这种行为。 RequestRateLimiter 不能用 快捷方式 来配置。下面的例子是无效的。 Example 43. application.properties # 无效的快捷方式配置
spring.cloud.gateway.routes[0].filters[0]RequestRateLimiter2, 2, #{userkeyresolver} Redis RateLimiter
Redis的实现是基于 Stripe 的工作。它需要使用 spring-boot-starter-data-redis-reactive Spring Boot Starter。 使用的算法是 令牌桶算法。
常用的更平滑的限流算法有两种漏桶算法 和 令牌桶算法。 漏桶算法
漏桶算法思路很简单水请求先进入到漏桶里漏桶以一定的速度出水接口有响应速率当水流入速度过大会直接溢出访问频率超过接口响应速率然后就拒绝请求可以看出漏桶算法能强行限制数据的传输速率。 可见这里有两个变量一个是桶的大小支持流量突发增多时可以存多少的水burst另一个是水桶漏洞的大小rate。因为漏桶的漏出速率是固定的参数所以即使网络中不存在资源冲突没有发生拥塞漏桶算法也不能使流突发burst到端口速率。因此漏桶算法对于存在突发特性的流量来说缺乏效率。
令牌桶算法
令牌桶算法 和漏桶算法 效果一样但方向相反的算法更加容易理解。随着时间流逝系统会按恒定 1/QPS 时间间隔如果 QPS100则间隔是 10ms往桶里加入 Token想象和漏洞漏水相反有个水龙头在不断的加水如果桶已经满了就不再加了。新请求来临时会各自拿走一个 Token如果没有 Token 可拿了就阻塞或者拒绝服务。 令牌桶的另外一个好处是可以方便的改变速度。一旦需要提高速率则按需提高放入桶中的令牌的速率。一般会定时比如 100 毫秒往桶中增加一定数量的令牌有些变种算法则实时的计算应该增加的令牌的数量。
redis-rate-limiter.replenishRate 属性定义了每秒钟允许多少个请求不算放弃的请求。这是令牌桶被填充的速度。
redis-rate-limiter.burstCapacity 属性是一个用户在一秒钟内允许的最大请求数不算放弃的请求。这是令牌桶可以容纳的令牌数量。将此值设置为零会阻止所有请求。
redis-rate-limiter.requestedTokens 属性是指一个请求要花费多少令牌。这是为每个请求从桶中提取的令牌数量默认为 1。
一个稳定的速率是通过在 replenishRate 和 burstCapacity 中设置相同的值来实现的。可以通过设置高于补给率的 burstCapacity 来允许临时的突发。在这种情况下速率限制器需要在突发之间允许一些时间根据 replenishRate因为连续两次突发会导致请求被放弃HTTP 429 - Too Many Requests。下面的列表配置了一个 redis-rate-limiter。
低于 1个请求/s 的速率限制是通过将 replenishRate 设置为想要的请求数 requestTokens 设置为秒数burstCapacity 设置为 replenishRate 和 requestTokens 的乘积来完成的。例如设置 replenishRate1requestedTokens60burstCapacity60结果是1个请求/分钟的限制。
Example 44. application.yml
spring:cloud:gateway:routes:- id: requestratelimiter_routeuri: https://example.orgfilters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10redis-rate-limiter.burstCapacity: 20redis-rate-limiter.requestedTokens: 1 下面的例子在Java中配置了一个 KeyResolver。
Example 45. Config.java
Bean
KeyResolver userKeyResolver() {return exchange - Mono.just(exchange.getRequest().getQueryParams().getFirst(user));
}这定义了每个用户的请求率限制为10。爆发20次是允许的但是在下一秒只有10个请求可用。KeyResolver 是一个简单的获得 user 请求参数。
你也可以把速率限制器定义为一个实现 RateLimiter 接口的bean。在配置中你可以用SpEL来引用bean的名字。#{myRateLimiter} 是一个SpEL表达式它引用了一个名为 myRateLimiter 的 bean。下面的清单定义了一个速率限制器它使用了前面清单中定义的 KeyResolver。
Example 46. application.yml
spring:cloud:gateway:routes:- id: requestratelimiter_routeuri: https://example.orgfilters:- name: RequestRateLimiterargs:rate-limiter: #{myRateLimiter}key-resolver: #{userKeyResolver}