写点什么

限流的几种方案

作者:想要飞的猪
  • 2024-01-10
    广东
  • 本文字数:994 字

    阅读完需:约 3 分钟

  • nginx 限流

进行相关配置 语法:limit_req_zone key zone rate

1、key 定义限流对象 $binary_remote_addr 表示 根据客户端 ip 来限流

2、zone 定义共享内存来存储限访问信息,mylimit:10m 表示一个大小为 10M 的额名字为 mylimit 的内存区域。

3、rate 用于设置最大访问速率 ,rate、 =2r/s 表示每秒最多处理 10 个请求

限制访问频率(突发流量)ng 使用 burst=20 nodelay 表示这 20 个请求立马请求(也是说一定会立马处理),类似与缓存队列,

限制并发量 Nginx 的 ngx_http_limit_conn_module 模块提供了对资源连接数进行限制的功能,使用 limit_conn_zone 和 limit_conn 两个指令

limit_conn perip 20:对应的 key 是 $binary_remote_addr,表示限制单个 IP 同时最多能持有 20 个连接。

limit_conn perserver 100:对应的 key 是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。注意,只有当 request header 被后端 server 处理后,这个连接才进行计数。


limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;limit_conn_zone $server_name zone=perserver:10m;server {     location / {         limit_req zone=mylimit burst=20 nodelay;        limit_conn perserver 100;        proxy_pass http://upstream_clusster1;    }}
复制代码


  • gateway 限流结合 Redis (要引入对应的包 spring-boot-starter-data-redis-reactive)实现限流(令牌桶算法):

配置 name 为 RequestRateLimiter 的 filter 设置参数

  • 服务端限流利用 com.google.guava 实现限流


   public static void main(String[] args) {      // 每秒产生 10 个令牌(每 100 ms 产生一个)      RateLimiter rateLimiter =  RateLimiter.create(10);      for (int i = 0; i < 20; i++) {          new Thread(() -> {              // 获取 1 个令牌              rateLimiter.acquire();              System.out.println("正常执行方法,ts:" + Instant.now());          }).start();      }    }
复制代码


  • tomcat 限流配置 tomcat 的参数实现限流


<Connector port="8080" protocol="HTTP/1.1"          connectionTimeout="20000"          maxThreads="150"          redirectPort="8443" />  // 其中 `maxThreads` 就是 Tomcat 的最大线程数,当请求的并发大于此值(maxThreads)时,请求就会排队执行,这样就完成了限流的目的。
复制代码


用户头像

还未添加个人签名 2020-06-05 加入

还未添加个人简介

评论

发布
暂无评论
限流的几种方案_想要飞的猪_InfoQ写作社区