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

o 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 可随意伪造。

用 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 来源的连接数。

分享一套SpringBoot开发博客系统源码,以及完整开发文档!速度保存!

并不是所有的连接都会被模块计数;只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    ...
    server {
        ...
        location /download/ {
            limit_conn addr 1;
        }

猜你喜欢

转载自blog.csdn.net/yelvgou9995/article/details/106737259