我想,大家平时接触最多的app就是淘宝、京东了吧!这些大的电商网站,每天处理的访问量都是亿级的。如果,不对系统中的各个接口进行保护,当并发访问量大时,系统就会发生故障。

所以,保护好系统,就会用到缓存、降级和限流这三把利器。前面讲过了断路器Hystrix的熔断与降级;缓存可以使用内存里面的缓存队列、消息中间件、分布式缓存;限流可以使用Zuul来实现。通过限流,可以很好地控制系统的qps。

每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。服务限流 方法一:Zuul+RateLimiter

RateLimiter是Guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率。

至于令牌桶算法的基本流程,大家可以通过查询相关资料进行学习。给大家推荐一个讲解令牌桶算法的视频,个人觉得易于理解。,接下来,就用代码的方式来实现Zuul的限流。

要用RateLimiter,需要导入相应的约束,所以,就对上篇博文中的网关服务(api-gateway)进行改造,pom中增加约束。

注意,这里需要用到Redis,所以也需要把Redis的约束导入。然后在yml中添加相应的配置。公众 号Java精选,回复java面试,获取面试资料,支持在线刷题。

综上所述:所有服务在5秒内只能有10次请求,并且请求的时间总和不得超过4秒。

可以看到,在启动网关服务的时候,出现了异常。上面指出zuul.ratelimit.repository这个配置,不能为空。相信大家对repository这个词并不陌生。我们原来在学Mybatis、JPA、Hibernate的时候经常看到。

所以,这个错误就是提示我们,需要某种仓库存储限流数据。通过点击配置文件,查看源码。

可以看到这是一个枚举类。其中,较为熟悉的就是REDIS、CONSUL、JPA。这里,就选择REDIS作为限流数据的存储。这就是pom文件中导入REDIS的原因。重新修改配置文件

上面限制5秒之内只能发送10次请求,那就发送11次请求试一试。使用postman工具进行请求的发送。同时,教大家如何使用postman批量发送请求。

首先,在地址栏填写接口地址,然后,可以点击send,测试当前地址是否正确。如果一切正常,点击旁边的save按钮。

出现上面的浮层,按照箭头的标注,进行操作,点击save按钮后,在左边就能看到已经保存的请求了。

按照文中给出的注释,进行设定,这里我就改一下请求的次数,设置为11次。然后点击run按钮发起请求,看测试结果。

可以看到,配置文件中规定请求次数为10次,测试前10次请求都是正常的响应。而第11次请求就被限流策略阻止了。证明了配置生效,接口限流成功。

Zuul的过滤器功能,不仅可以做权限验证,也可以拿来做限流。所以,新建一个过滤器,让其继承ZuulFilter

因为Guava是基于令牌桶算法的实现类,所以RateLimiter.create(10)可以理解为:每秒往桶里放入10个令牌。RATE_LIMITER.tryAcquire()方法尝试获取桶里的令牌,如果有,则返回true,并且,总的令牌数减1。没有则返回false。后面的逻辑和权限验证相似。设置Htpp状态码,然后返回信息到前台展示。

奇怪的事情发生了,可以看到第十八个请求被限流了,但是第十九个请求又成功了。其实这也不难理解,当第十八个请求到达网关时,木桶里已经没有令牌可以获取了。所以,直接被限流策略限制。

其实,除了网关层的限流,还能在Nginx层上做限流。感兴趣的朋友,可以去看一下Nginx方面的知识。一个高性能的HTTP和反向代理服务器,作为一名开发人员,了解和使用它,也是必不可少的。

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注