什么是限流
限制客户端的请求数到达服务器就是限流。
条件
nginx服务器
项目实例【以查询商品为例,启动两个实例 ,端口:5000\5001】
使用 jemter 压测
Nginx 实现限流
条件
限流定义
# 命令 主机名称变量 限流的空间用来存储请求量的 limit_conn_zone $server_name zone=perserver:10m;
使用限流 在反向代理中添加配置
limit_conn perserver 1; #只允许一条请求到这个反向代理服务器
nginx.conf 整体配置代码如下:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #限流定义 limit_conn_zone $server_name zone=perserver:10m; server { listen 80; server_name localhost; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } #代理 location / { limit_conn perserver 1; proxy_pass http://Demo.Application; } } #负载均衡(分流配置) upstream Demo.Application{ least_conn; server localhost:5000; server localhost:5001; } }
项目项目实例
新建控制器
代码如下:
[Route("api/[controller]")] [ApiController] public class ProductController : ControllerBase { /// <summary> ///获取商品数据 /// </summary> /// <returns></returns> [HttpGet] public IActionResult Get() { List<Product> list = new List<Product>() { new Product(){ Name="手机", Price = 1000 }, new Product(){ Name="笔记本电脑", Price = 5000 }, new Product() { Name="电视机", Price = 5000 } }; System.Console.WriteLine("查询商品"); return Ok(list); } }
新建一个 实体数据模型,代码如下:
public class Product { /// <summary> /// 主键 /// </summary> public Guid Id { get; set; } = Guid.NewGuid(); /// <summary> /// 名称 /// </summary> public string Name { get; set; } /// <summary> /// 价格 /// </summary> public decimal Price { get; set; } }
启动两个实例 (5000/5001),如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片
启动nginx ,命令如下:
nginx.exe
- Jmter工具 链接:https://pan.baidu.com/s/1chveNMju5jv5kOYvR8DL1A 提取码:h0gg
限流原理
限流原理图
当客户端发送请求到nginx服务其中,nginx会将请求存储到 10m的空间中,同时反向代理根据限流的配置,到空间中取并发请求,在调用代理处理并发请求;同时这地方有几个处理请求的状态:处理中,处理成功和处理失败;处理中:后端代理还没有处理完成从空间取的并发请求,则会将请客户端发送过来的请求,全部拒绝返回;
处理完成:后端代理已经完成从空间取的并发请求,则再到空间中取并发请求,再交给后端代理处理请求;
执行完Jemter的结果如下:
比如以查询商品为例,当客户端发送请求到nginx中,nginx会将请求存储到空间中,反向代理会根据限量配置数量(例如:配置的并发量为:2)到空间中取2个并发的请求,交给代理服务器处理请求,同时反向代理再会到空间中取2个并发的请求,交给代理服务器,如果代理服务上一次的请求没有处理完成,则会将该取2个的请求拒绝返回;同时反向代理再会到空间中取2个并发的请求,如果第一次的请求处理完成1个,则会将从空间取的2个请求中取1个交个代理服务处理,另一个拒绝返回;同时反向代理再会到空间中取2个并发的请求,如果第一次的请求处理完成,则会将取2个并发请求再交给代理服务器处理,......... 直到处理完成。
用计数器的算法来实现的。
缺陷:
优点:
客户端限流
条件
定义客户端限流
limit_conn_zone $binary_remote_addr zone=perserver:10m;
使用限流
limit_conn perserver 1;
原理
执行原理和限流的基本上原理一样。
平滑限流
条件
定义平滑限流
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #rate:速率 1秒钟取1个,剩下的请求全部拒绝返回
使用平滑限流
limit_req zone=one burst=3 nodelay; #burst :突发 nodelay 突发:延时 加上nodelay 突发的请求不需要Token
配置HTTPS
条件
配置虚拟主机
http{ server { listen 4425 ssl; server_name localhost; ssl_certificate #证书文件路径 ssl_certificate_key #证书文件路径 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; location / { proxy_pass http://Demo.Application; } } }
重定向
#在http模块中添加重定向配置 server{ if ($scheme =http){ return 301 https://$host:4435$request_uri; } }