❒ 为什么要限流?
✔ 并发的确大(突发流量)
✔ 防止用户恶意刷接口
❒ 限流的实现方式:
☪ 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:令牌桶总容量。
☪ 自定义拦截器