大家好,我是空灵。Springboot Old Bird系列的文章写了四篇文章,每篇文章的阅读响应还不错。今天,我将继续为您带来旧鸟类系列的第五部分,讨论如何在Springboot项目中限制界面,什么是常见的当前限制算法以及如何优雅地执行(基于AOP)。
首先,让我们看看为什么需要接口?
由于互联网系统通常需要面对大规模的大型交通请求,因此,在紧急情况下(最常见的场景是尖峰,snap -up),瞬时大流量将直接击败系统,无法在外部提供服务。防止这种情况最常见的解决方案之一,最常见的解决方案之一是当前限制。当请求达到一定数量的并发或费率时,等待,排队,降级和拒绝服务。
例如,面对高并发的12306票购买系统使用当前限制。“有很多人排队,请稍后再试!”
当前的限制是一次限制窗口中的请求数量,以保持系统的可用性和稳定性,以防止由于流量激增而缓慢或向下运行。
当前有三种常见的极限算法:
1.冷却装置限制
反限制算法是最简单,最粗鲁的解决方案,主要用于限制分布总数。例如,数据库连接池的大小,线程池大小,接口访问的并发使用计数器算法。
例如,目前正在执行使用AomicInteger进行统计。如果超过域值,则可以直接拒绝该请求,并提示系统忙。
2.泄漏枪管算法
泄漏枪管算法的思考非常简单。我们将水与水进行比较。比较泄漏枪管。水首先进入泄漏。容量有限,随后的水溢出(拒绝要求)以达到当前限制。
3.令牌枪管算法
令牌桶算法的原理也相对简单。我们可以理解,这是一家医疗医院。只有在获得数字后才能进行诊断。
该系统将保持令牌()桶,并以恒定的速度将令牌()放在存储桶中。目前,如果您需要进来并想要处理,则需要从桶()作为桶中获得令牌()。被拒绝。令牌枪管算法可以通过控制枪管的能力和令牌速率来实现对请求的限制。
Google开源工具包Guava提供当前的限制工具类型Ratelimiter。该课程基于令牌桶算法以实施流量限制。它非常方便且非常有效。实施步骤如下:
步骤1:介绍Guava依赖包
步骤2:将记录器添加到接口
上面使用了比率的两种核心方法:,以下是详细描述
步骤3:经验效果通过测试地址:http://127.0.0.1:8080/limit/test1,反复刷新并观察后端log
从上面的日志中可以看出,仅在1秒内获得2个成功,而其他日志则失败和降级,这表明我们已经成功地向接口添加了流量限制函数。
当然,我们不能直接在实际开发中使用它。由于原因,您认为,每个界面都需要手动添加它,业务代码和当前限制代码混合在一起,显然违反了干燥原理,代码冗余,并反复进行劳动。代码审查肯定会被老鸟嘲笑,什么休息!
因此,我们需要找到一种优化它的方法 - 使用自定义注释+AOP实现接口限制。
基于AOP的实现方法也非常简单。实施过程如下:
步骤1:添加AOP依赖关系
步骤2:自定义限制注释
步骤3:使用AOP切割表面拦截有限的流入解决方案
步骤4:将注释添加到需要受到限制的接口
通过访问测试地址:http://127.0.0.1:8080/limit/test2,反复刷新并观察输出结果:
在正常响应期间:
触发流量限制时:
通过观察,基于自定义注释,还可以实现界面限制的效果。
通常,当启动系统时,我们可以通过按系统来评估系统的性能阈值,然后在接口中添加合理的当前限制参数,以防止系统直接在出现大型流量请求时直接压倒系统。几种常见的当前极限算法(着重于令牌枪管算法)。基于Guava工具类,实现了接口限制,并使用AOP完成了当前限制代码的优化。
优化完成后,将业务代码和当前限制代码解耦。只要开发人员需要注释,他们就不需要关心当前限制的逻辑,并且降低代码冗余已大大提高了代码的可读性。谁可以在代码审查期间为您开个玩笑。
好吧,这是今天文章的结尾。最后,我是一个朦胧的果酱,是一名建筑师,他写了代码,是一个架构的程序员,期待着您的转发和关注。当然,欢迎您通过下面的QR码加我。个人微信,让我们一起谈谈技术!
Old Bird系列的源代码已上传到GitHub,并且需要在公共帐户[Java Nikko]中获取源代码地址。