📚 分类
spring cloud
🕵🏽‍♀️ 问题描述
你们项目中有没有做过限流?怎么做的?
👨‍🏫 问题讲解
❒ 为什么要限流?

✔ 并发的确大(突发流量)
✔ 防止用户恶意刷接口

❒ 限流的实现方式:

☪ Tomcat:可以设置最大连接数(单个服务)

<Connector port="8080"protocol="HTTP/1.1"
connectionTimeout="20000" maxThreads="150" 可以设置最大连接数
redirectPort="8443"/>

☪ Nginx:漏桶算法

控制速率(突发流量)

http {
    limit _req_zone $binary_remote_addr zone=servicelRatelimit:10m rate=10r/s
    server {
        listen 80;
        server name localhost;
        location / {
            limit reg zone =servicelRateLimit burst=20 nodelay;
            proxy_pass http://targetserver;
        }
    }
}

✔ 语法: limit req zone key zone rate
✔ key:定义限流对象,binary_remote_addr就是一种key,基于客户端ip限流
✔ Zone:定义共享存储区来存储访问信息,10m可以存储16wip地址访问信息
✔ Rate:最大访问速率,rate=10r/s表示每秒最多请求10个请求
✔ burst=20:相当于桶的大小
✔ Nodelay:快速处理

❒ 控制并发连接数

✔ limit_conn perip 20:对应的key是 $binary_remote_addr,表示限制单个IP同时最多能持有20个连接limit conn perserver 100:
✔ 对应的key是$server _name,表示虚拟主机(server)同时能处理并发连接的总数。


☪ 网关:令牌桶算法

✔ yml配置文件中,微服务路由设置添加局部过滤器RequestRateLimiter
✔ key-resolver:定义限流对象(ip、路径、参数),需代码实现,使用spel表达式获取
✔ replenishRate:令牌桶每秒填充平均速率。
✔ urstCapacity:令牌桶总容量。

☪ 自定义拦截器


🏳️‍🌈 问题总结
❒ 先来介绍业务,什么情况下去做限流,需要说明QPS具体多少

✔ 我们当时有一个活动,到了假期就会抢购优惠券,QPS最高可以达到2000,平时10-50之间,为了应对突发流量需要做限流
✔ 常规限流,为了防止恶意攻击,保护系统正常运行,我们当时系统能够承受最大的QPS是多少(压测结果)

❒ 限流算法

✔ 令牌桶算法(发放令牌速率固定)
✔ 漏桶算法(执行速率固定)
✔ 滑动时间窗口(实现简单,但是容易集中在某个时间段内)


❒ nginx限流

✔ 控制速率(突发流量),使用的漏桶算法来实现过滤,让请求以固定的速率处理请求,可以应对突发流量
✔ 控制并发数,限制单个ip的链接数和并发链接的总数

❒ 网关限流

✔ 在spring cloud gateway中支持局部过滤器RequestRateLimiter来做限流,使用的是令牌桶算法
✔ 可以根据ip或路径进行限流,可以设置每秒填充平均速率,和令牌桶总容量
📖 问题信息
📈 浏览次数:13 | 📅 更新时间:2025-12-03 14:07:01
📦 创建信息
🏷️ ID:63 | 📅 创建时间:2025-01-08 14:21:07