背景
我想,大家平时接触最多的app就是淘宝、京东了吧!这些大的电商网站,每天处理的访问量都是亿级的。如果,不对系统中的各个接口进行保护,当并发访问量大时,系统就会发生故障。
所以,保护好系统,就会用到缓存、降级和限流这三把利器。前面讲过了断路器Hystrix的熔断与降级;缓存可以使用内存里面的缓存队列、消息中间件、分布式缓存;限流可以使用Zuul来实现。通过限流,可以很好地控制系统的qps。
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
服务限流
方法一:Zuul+RateLimiter
RateLimiter是Guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率。
至于令牌桶算法的基本流程,大家可以通过查询相关资料进行学习。给大家推荐一个讲解令牌桶算法的视频,个人觉得易于理解。https://www.bilibili.com/video/av26168532/ ,接下来,就用代码的方式来实现Zuul的限流。
要用RateLimiter,需要导入相应的约束,所以,就对上篇博文中的网关服务(api-gateway)进行改造,pom中增加约束。
<dependency>
<groupId>com.marcosbarbero.cloud</groupId>
<artifactId>spring-cloud-zuul-ratelimit</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
注意,这里需要用到Redis,所以也需要把Redis的约束导入。然后在yml中添加相应的配置。
ratelimit:
enabled: true
default-policy:
limit: 10
quota: 4
refresh-interval: 5
type: #可选 限流方式
- url
-
ratelimit.enabled=true
表示开启限流策略。 -
ratelimit.default-policy.limit=10
表示请求控制在10次以内。 -
ratelimit.default-policy.quota=4
请求时间不得超过4秒。 -
ratelimit.default-policy.refresh-interval=5
刷新间隔是5秒。
综上所述:所有服务在5秒内只能有10次请求,并且请求的时间总和不得超过4秒。
配置完成,接下来,启动服务,进行测试。
可以看到,在启动网关服务的时候,出现了异常。上面指出zuul.ratelimit.repository