高并发之API接口,分布式,防刷限流,如何做?( 四 )

controller:@Controller@RequestMapping("/activity")public class AopController {@ResponseBody@RequestMapping("/seckill")@AccessLimit(limit = 4,sec = 10)//加上自定义注解即可public String test (HttpServletRequest request,@RequestParam(value = https://www.isolves.com/it/cxkf/jiagou/2020-01-02/"username",required = false) String userName){//TODO somethings……return"hello world !";}}配置文件:/*springmvc的配置文件中加入自定义拦截器*/<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.pptv.activityapi.controller.pointsmall.AccessLimitInterceptor"/></mvc:interceptor></mvc:interceptors>访问效果如下,10s内访问接口超过4次以上就过滤请求,原理和计数器算法类似:

高并发之API接口,分布式,防刷限流,如何做?

文章插图
 
接入层限流主要介绍nginx 限流,采用漏桶算法 。
限制原理:可一句话概括为:“根据客户端特征,限制其访问频率”,客户端特征主要指IP、UserAgent等 。使用IP比UserAgent更可靠,因为IP无法造假,UserAgent可随意伪造 。整编:微信公众号,搜云库技术团队,ID:souyunku
用limit_req模块来限制基于IP请求的访问频率:
http://nginx.org/en/docs/http/ngxhttplimitreqmodule.html
也可以用tengine中的增强版:
http://tengine.taobao.org/documentcn/httplimitreqcn.html
1、并发数和连接数控制的配置:nginx http配置:#请求数量控制,每秒20个limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;#并发限制30个limit_conn_zone $binary_remote_addr zone=addr:10m;server块配置limit_req zone=one burst=5;limit_conn addr 30;2、ngxhttplimitconnmodule 可以用来限制单个IP的连接数:ngxhttplimitconnmodule模块可以按照定义的键限定每个键值的连接数 。可以设定单一 IP 来源的连接数 。
并不是所有的连接都会被模块计数;只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数 。
http {limit_conn_zone $binary_remote_addr zone=addr:10m;...server {...location /download/ {limit_conn addr 1;}
【高并发之API接口,分布式,防刷限流,如何做?】


推荐阅读