官方文档上支持根据ip、用户、rul限流,但是在官方提供的配置方案中,不同的路由规则只能配置相同的限流方案,比如,要么都是ip限流,要么都是用户限流(在程序中无法初始化多个相同的限流bean,如下代码,一个类中只能有一个KeyResolver的bean)
@Configuration
public class RedisRateLimiterConfig
{
/**
* 针对ip限流
*
* @return
*/
@Bean
public KeyResolver ipKeyResolver()
{
return exchange -> Mono.just(exchange.getRequest().getHeaders().getFirst("X-Forwarded-For"));
}
/**
* 按照Path限流
*
* @return key
*/
// @Bean
// public KeyResolver pathKeyResolver()
// {
// return exchange -> Mono.just(exchange.getRequest().getPath().toString());
// }
/**
* 针对用户限流
*
* @return
*/
// @Bean
// public KeyResolver userKeyResolver()
// {
// return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
// }
}
配置文件如下:
routes:
# 路由标识(id:标识,具有唯一性) 限流
- id: route_requestRateLimiter
# 目标服务地址(uri:地址,请求转发后的地址)
uri: lb://bobfintech-userservice
# 路由条件(predicates:断言,匹配 HTTP 请求内容)
predicates:
## 匹配 GET 请求
- Method=GET
# 过滤器(filters:过滤器,过滤规则)
filters:
## 添加指定参数
- AddRequestParameter=age, three
## 限流
- name: RequestRateLimiter #name必须为这个Filter
args:
### 限流过滤器的 Bean 名称,使用SpEL表达式从Spring容器中获取Bean对象
key-resolver: '#{@ipKeyResolver}'
### 希望允许用户每秒处理多少个请求,也就是令牌桶每秒填充平均速率
redis-rate-limiter.replenishRate: 1
### 用户允许在一秒钟内完成的最大请求数,令牌桶的上限
redis-rate-limiter.burstCapacity: 3
那么问题来了,在实际的企业开发中,不可能所有的路由都只用一种限流方式,那么,该如何配置,才能实现不同的路由使用不同的限流方案呢?