高性能Java秒杀系统优化(三)--接口限流防刷

 

如何实现接口限流防刷

有了对用户的访问进行一定的限制,就可以减轻服务器压力。例如通过访问次数的限制就是一种限流防刷的手段。即限制用户下一定的时间间隔内对接口的访问次数。

实现思路:对接口限流

一般来讲如果使用计时器来做这个功能,实现起来比较复杂。在这里,我们可以充分利用redis中的key-value过期机制来完成。

在redis中存储一个用于记录访问次数的变量,在过期时间内被继续访问,则次数变量加1,如果在过期时间内访问次数超出限制,则返回“频繁提交提示用户”。过期时间到了之后,将该变量删除。

因为可能需要对很对接口对限流防刷操作,如果对每一个接口都实现一遍限流防刷,则会导致代码过度冗余,因此,可以定义一个方法拦截器@AccessInterceptor拦截用户对接口的请求,统一对拦截限流逻辑处理,这样可以有效地减少代码的冗余。针对需要拦截请求的接口,添加注解@AccessLimit即可。

接口限流

记录用户每次访问某接口的次数,并设置到缓存,并设置有效期,在x 秒内允许访问y次。

1、为了测试,我们设置5秒中内有效,5秒钟访问5次,超过5次直接返回“操作太频繁”

高性能Java秒杀系统优化(三)--接口限流防刷

第一次与第二次间隔5秒以上,redis缓存已过期,又重新计算

2、MiaoshaController

在获取秒杀地址接口中增加限制,位于校验验证码之前

每次访问加1,超过5次返回“操作台频繁”

设置到redis,key : 当前获取秒杀地址请求的url + 用户id

高性能Java秒杀系统优化(三)--接口限流防刷

 

但是,假如 秒杀接口、获取秒杀结果接口等也要限制,是不是都要写这样的逻辑,所以需要写一个通用的方法吗,比如注解+拦截器。

优化:注解+拦截器

1、注解效果如下:

高性能Java秒杀系统优化(三)--接口限流防刷

2、新建AccessLimit 限流注解

x秒内允许访问最大次数,是否需要登录

高性能Java秒杀系统优化(三)--接口限流防刷

3、新增一个拦截器

高性能Java秒杀系统优化(三)--接口限流防刷

4、实现prehandle()方法,将上面限流的逻辑代码拷贝过来修改

高性能Java秒杀系统优化(三)--接口限流防刷

高性能Java秒杀系统优化(三)--接口限流防刷

注:这里也需要获取MiaoshaUser对象,而之前有写过一个通用的方法,直接拷贝过来

高性能Java秒杀系统优化(三)--接口限流防刷

但是这样就会有重复的代码,所以再次优化:

上面获取到MiaoshaUser对象之后,再设置到一个ThreadLocal 本地变量中(多线程)

高性能Java秒杀系统优化(三)--接口限流防刷

UserContext

高性能Java秒杀系统优化(三)--接口限流防刷

之前的UserArgumentResolver 则直接调用UserContext.getUser即可

高性能Java秒杀系统优化(三)--接口限流防刷

5、注册拦截器

高性能Java秒杀系统优化(三)--接口限流防刷

整理:https://coding.imooc.com/class/168.html#Envir

注:上两节分别介绍了秒杀接口地址的隐藏、图形数学公式验证码。

高性能Java秒杀系统优化(三)--接口限流防刷

史上最强Tomcat8性能优化

阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路

B2B电商平台--ChinaPay银联电子支付功能

学会Zookeeper分布式锁,让面试官对你刮目相看

SpringCloud电商秒杀微服务-Redisson分布式锁方案

查看更多好文,进入公众号--撩我--往期精彩

一只 有深度 有灵魂 的公众号0.0高性能Java秒杀系统优化(三)--接口限流防刷

高性能Java秒杀系统优化(三)--接口限流防刷