服务限流

为什么要限流?

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

限流的实现方式

  • Tomcat:可以设置最大连接数
  • Nginx,漏桶算法
  • SpringGateway网关,令牌桶算法
  • 自定义拦截器
image-20230822154748824

Nginx限流

控制流速

Nginx配置文件

image-20230822154901046

语法:limit_req_zone key zone rate

key:定义限流对象,binary_remote_addr就是一种key,表示使用客户端的IP地址作为限流键

zoneservice1RateLimit:10m表示创建一个名为service1RateLimit的限流区域,大小为10兆字节(代表限流区域可以存储的键值对数量)

rate:最大访问速率,rate=10r/s 表示流速为每秒处理10个请求

burst=20:相当于桶的大小

nodelay:快速处理

image-20230822155723504

控制并发连接数

Nginx配置文件

image-20230822155742385

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

limit_conn perserver 100:对应的key是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。

Gateway限流

yml配置文件中,微服务路由设置添加局部过滤器RequestRateLimiter

image-20230822160006774
  • key-resolver:定义限流对象( ip 、路径、参数),需代码实现,使用spel表达式获取
  • replenishRate:令牌桶每秒填充平均速率。
  • urstCapacity:令牌桶总容量。
image-20230822160153801