使用spring-cloud-zuul-ratelimit限流
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></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个成功: