pring Cloud Zuul RateLimit项目Github地址:
https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit
该包实现了在Zuul对每个服务进行限流。提供的几种限流方式:
1. 认证用户(Authenticated User)
使用已认证的用户名(username)或'anonymous'
2. 原始请求(Request Origin)
使用用户的原始请求
3. URL
使用上游请求的地址
4. 针对每个服务的全局配置
该方式不会验证Request Origin,Authenticated User或URL
使用该方式只需不设置‘type’参数即可
使用方式
pom.xml增加依赖:
<dependency>
<groupId>com.marcosbarbero.cloud</groupId>
<artifactId>spring-cloud-zuul-ratelimit</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
配置示例:
zuul:
ratelimit:
key-prefix: your-prefix #对应用来标识请求的key的前缀
enabled: true
repository: REDIS #对应存储类型(用来存储统计信息)
behind-proxy: true #代理之后
default-policy: #可选 - 针对所有的路由配置的策略,除非特别配置了policies
limit: 10 #可选 - 每个刷新时间窗口对应的请求数量限制
quota: 1000 #可选- 每个刷新时间窗口对应的请求时间限制(秒)
refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)
type: #可选 限流方式
- user
- origin
- url
policies:
myServiceId: #特定的路由
limit: 10 #可选- 每个刷新时间窗口对应的请求数量限制
quota: 1000 #可选- 每个刷新时间窗口对应的请求时间限制(秒)
refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)
type: #可选 限流方式
- user
- origin
- url
通用应用程序配置
配置命名空间:zuul.ratelimit
说明:使用不同的repository,需要在pom中加入相关的依赖包。
Policy属性:
测试
1. 启动一个Zuul服务和一个API服务,配置正常的路由规则。访问API:
2. 按照上面的使用方式,重新启动配置有RateLimit的Zuul。相关配置:
zuul:
ratelimit:
key-prefix: ZUUL-LIMIT
enabled: true
repository: REDIS
behind-proxy: true
add-response-headers: false
default-policy-list: #optional - will apply unless specific policy exists
- limit: 200 #optional - request number limit per refresh interval window
refresh-interval: 60 #default value (in seconds)
type: #optional
# - user
- origin
## - url
## - httpmethod
policy-list:
myServiceId: #特定的路由
- limit: 10
refresh-interval: 60
type:
- url=/api/common/user/hadAccount
- origin
- limit: 10
refresh-interval: 60
type:
- url=/api/common/user/registry/weChatDirectRegistryLogin
- origin
- limit: 2
refresh-interval: 1
type:
- url=/api/customer/queryQuotaStatus
- origin
- limit: 10
refresh-interval: 60
type:
- url=/api/common/customer/setGeographic
- origin
3. 在jmerter中并发请求20个以上配置路径的API调用,只有部分10个成功: