Spring Cloud Zuul RateLimit项目Github地址:git
https://github.com/marcosbarbero/spring-cloud-zuul-ratelimitgithub
该包实现了在Zuul对每一个服务进行限流。提供的几种限流方式:spring
1. 认证用户(Authenticated User)api
使用已认证的用户名(username)或'anonymous'post
2. 原始请求(Request Origin)测试
使用用户的原始请求url
3. URL3d
使用上游请求的地址代理
4. 针对每一个服务的全局配置orm
该方式不会验证Request Origin,Authenticated User或URL
使用该方式只需不设置‘type’参数便可
pom.xml增长依赖:
<dependency>
<groupId>com.marcosbarbero.cloud</groupId>
<artifactId>spring-cloud-zuul-ratelimit</artifactId>
<version>1.3.2.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。相关配置:
3. 在postman中集中运行12次相同的API调用,结果中有两次调用返回429:
4. 查看对应的Response Headers和Body的信息:
若是但愿本身控制key的策略,能够经过自定义RateLimitKeyGenerator的实现来增长本身的策略逻辑。
实例:
根据请求上的参数来对请求进行限流。好比有一个请求是http://localhost:8765/api-a//hello2?name=kevin,对相同的name值进行限流。咱们设置了1分钟内,限流10次,那么若是1分钟内,name是kevin的请求超过10次,就会发生限流。
RateLimitKeyGenerator的实现:
测试
同时发送13个请求,其中name=kevin的有11次,name=marry的有2次,测试结果以下: