用于在网关Zuul中启用每项服务的访问速率限制的模块。
有四种内置速率限制方法:
-
根据用户(User)
-
使用认证用户的用户代码或者匿名用户’anonymous'
-
-
请求源地址(Orign)
-
根据请求的源地址信息
-
-
接口URL(URL)
-
根据下游服务的请求路径
-
-
请求方法类型(Request method)
-
根据请求方法的类型(GET,POST,PUT,DELETE)
-
-
可针对每项服务进行全局配置
-
要使用这种方式配置,请不要设置参数’type'
-
Note
|
只需将多个配置段添加到列表中,就可以组合经过身份验证的用户,请求源,URL和请求方法的方式进行限流。 |
在pom.xml文件中添加依赖
<dependency>
<groupId>ins.framework.cloud</groupId>
<artifactId>spring-cloud-zuul-ratelimit</artifactId>
<version>6.2.2-SNAPSHOT</version>
</dependency>
添加redis依赖作为限流数据存储的数据源
-
Redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置样例
zuul:
ratelimit:
key-prefix: your-prefix
enabled: true
repository: REDIS
behind-proxy: true
add-response-headers: true
default-policy-list: #optional - will apply unless specific policy exists
- limit: 10 #optional - request number limit per refresh interval window
quota: 1000 #optional - request time limit per refresh interval window (in seconds)
refresh-interval: 60 #default value (in seconds)
type: #optional
- user
- origin
- url
- httpmethod
policy-list:
myServiceId:
- limit: 10 #optional - request number limit per refresh interval
quota: 1000 #optional - request time limit per refresh interval window (in seconds)
refresh-interval: 60 #default value (in seconds)
- type: #optional value for each type
- user=anonymous
- origin=somemachine.com
- url=/api #url prefix
- httpmethod=get #case insensitive
我们推荐的是用redis实现限流
实现 | 数据存储 |
---|---|
RedisRateLimiter |
属性空间: zuul.ratelimit
属性名 | 值 | 默认值 |
---|---|---|
enabled |
true/false |
false |
behind-proxy |
true/false |
false |
add-response-headers |
true/false |
true |
key-prefix |
String |
${spring.application.name:rate-limit-application} |
repository |
CONSUL, REDIS, JPA, BUCKET4J_JCACHE, BUCKET4J_HAZELCAST, BUCKET4J_INFINISPAN, BUCKET4J_IGNITE |
- |
default-policy-list |
List of Policy |
- |
policy-list |
Map of Lists of Policy |
- |
postFilterOrder |
int |
FilterConstants.SEND_RESPONSE_FILTER_ORDER - 10 |
preFilterOrder |
int |
FilterConstants.FORM_BODY_WRAPPER_FILTER_ORDER |
策略属性:
属性名 | 值 | 默认值 |
---|---|---|
limit |
number of calls |
- |
quota |
time of calls |
- |
refresh-interval |
seconds |
60 |
type |
[ORIGIN, USER, URL, ROLE] |
[] |
主要讲述怎么定制化自己的限流策略
如果应用程序需要控制超出type属性提供的选项的关键策略,那么它可以创建自定义[RateLimitKeyGenerator
]即可实现添加更多限流规则或者策略。
@Bean
public RateLimitKeyGenerator ratelimitKeyGenerator(RateLimitProperties properties, RateLimitUtils rateLimitUtils) {
return new DefaultRateLimitKeyGenerator(properties, rateLimitUtils) {
@Override
public String key(HttpServletRequest request, Route route, RateLimitProperties.Policy policy) {
return super.key(request, route, policy) + ":" + request.getMethod();
}
};
}
此框架使用一些第三方应用程序来存储控制速率限制访问数据,它无法控制这些应用程序,所以只需添加一些错误日志。框架本身就可以在类DefaultRateLimiterErrorHandler中处理失败。
如果需要以不同方式处理错误,可以通过定义自定义RateLimiterErrorHandler bean来实现,例如:
@Bean
public RateLimiterErrorHandler rateLimitErrorHandler() {
return new DefaultRateLimiterErrorHandler() {
@Override
public void handleSaveError(String key, Exception e) {
// custom code
}
@Override
public void handleFetchError(String key, Exception e) {
// custom code
}
@Override
public void handleError(String msg, Exception e) {
// custom code
}
}
}