服务高可用保障:服务限流,Nginx实现服务限流

news2024/11/20 6:17:05

一、前言

1.1什么是限流?

限流存在于高可用服务中。
用于高可用的保护手段,主要包括:缓存,降级,限流
限流:只允许指定的事件进入系统,超过的部分将被拒绝服务,排队或者降级处理。

1.2为什么需要限流?

一:服务扛不住压力了
二:因为资源的稀缺或者处于安全防范的目的而采用的自我保护机制,保证有限的资源提供最大的服务能力,按照预期的流量提供服务 ,超过的部分将会拒绝服务,排队或者降级处理

二、按照限流算法分类

2.1.计数器(固定窗口计数器)

通用及最简单的算法,简单逻辑是维护一个固定时间的计数器,如果检测到单位时间过去则记为0,重新计数
在这里插入图片描述

存在的问题
1.没有应对突发的流量的能力:如100的qps,前100ms来了99个,后900ms只能处理一个
2.不准确,在一个窗口内后半段时间来了100个请求,以及在后一个窗口的前半段时间100个请求,等同于在一个窗口内出现了双倍的限流的流量!

2.2 漏铜算法

在这里插入图片描述

水:请求
桶:限流阈值大小
漏的水滴:固定速率,服务的处理速度
实现步骤:
1.将每个请求放入固定的大小的队列进行存储
2.以固定的速率向外流出请求,队列为空则停止流出
3.队列满了则拒绝服务

2.3令牌桶算法

在这里插入图片描述

为了保证网站在遭受流量攻击的时候,仍然能够保障正常用户的访问不受到影响,有必要对网站添加限流措施。通过简单的配置Nginx,可以帮助我们实现这一功能。
优点:令牌桶支持突发流量
因为桶中有多少令牌在等待,就允许有多少突发请求可以执行

实现步骤:
1.以恒定的速率向桶中增加令牌
2.如果令牌满了直接丢弃,如果有请求则获取令牌进行请求
3.如果桶空了,则拒绝执行

三、Nginx实现服务限流

实现服务限流的方式有很多种,下面我主要介绍的是Nginx实现,优点是不用频繁部署jar服务,减少代码编写。提高效率,短时间解决问题

Nginx支持通过以下维度,来对用户的请求进行限制:

  1. 控制访问频率
  2. 控制并发连接数
  3. 控制访问速率
  4. IP黑白名单

3.1超过访问频率就立即拒绝

对应Nginx模块:ngx_http_limit_req_module

# 限流设置,这只是设置流量限制和共享内存区域的参数,但实际上并不限制请求速率。具体的限制需要定义具体的url
limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=10r/s;
# 指定错误码
limit_req_status 429;
 
server {
    location /update_content {        
        proxy_pass http://192.168.211.1:18081;
    }
 
    location /read_content {
        # 使用限流配置
        limit_req zone=contentRateLimit;
        proxy_pass http://192.168.211.1:18081;
    }
}
  • binary_remote_addr:表示基于客户端IP做限流,使用二进制来表示IP地址;
  • zone:定义共享内存区来存储访问信息;
  • contentRateLimit:10m 表示一个大小为10M,名字为contentRateLimit的内存区域; 1M能存储8000个IP地址的访问信息(64位平台);
  • rate:用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求;
  • limit_req_zone:只定义速度限制的相关参数,一般用于http块中,使其可以在多个相关server中使用;
  • limit_req:启用定义的限速参数;
    当存储空间耗尽的时候,如果需要记录新的值,那么就会通过LRU算法移除旧的变量来腾出空间,如果这样腾出来的空间还是不足以接纳新的记录值,那么nginx就会返回状态码503。此外,为了防止内存耗尽,nginx每次创建一个新记录值的时候就会清理掉两个60秒内没被使用过的旧记录值。
    (2) 支持处理突发流量
    超过流量不会立即被拒绝,允许加入一个队列,只有队列满了之后的请求才会被拒绝。如果有时正常流量突然增大,超出的请求将被拒绝,无法处理突发流量,就可以结合 burst 参数使用来解决该问题。

3.2支持处理突发流量

超过流量不会立即被拒绝,允许加入一个队列,只有队列满了之后的请求才会被拒绝。如果有时正常流量突然增大,超出的请求将被拒绝,无法处理突发流量,就可以结合 burst 参数使用来解决该问题。

# 限流设置,这只是设置流量限制和共享内存区域的参数,但实际上并不限制请求速率。具体的限制需要定义具体的url
limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=10r/s;
 
server {
    location /update_content {        
        proxy_pass http://192.168.211.1:18081;
    }
 
    location /read_content {
        # 使用限流配置
        limit_req zone=contentRateLimit burst=4 nodelay;
        proxy_pass http://192.168.211.1:18081;
    }
}
  • burst :表示在超过设定的处理速率后能额外处理的请求数。burst=4表示有4个请求到达,Nginx
    会处理第一个请求,剩余3个请求将放入队列,然后每隔100ms从队列中获取一个请求进行处理。若请求数大于4,将拒绝处理多余的请求,直接返回503。排队中的请求虽然每100ms会处理一个,但却需要等待
    较长的处理时间。所以burst 往往结合 nodelay 一起使用,以实现削峰填谷的效果;
  • nodelay :假设我们的流量是 2,1,4,0,2
    ,正常的请求会存在峰值和谷值,代表每秒的请求数。这样当流控为2r/s,burst=4
    nodelay时,在第3秒请求数为4时(峰值),仍然允许直接处理4个请求,但是后续的请求会被拦截,保证总流量不超过2r/s,因此,当第四秒请求数为0时,就起到了削峰填谷的作用。假设流量是2,1,4,4,4
    ,峰值持续的时间比较长,那么从第二个峰值开始,就会被真的流控,被拒绝或进行排队,这样即使被处理,也会延迟稍高!

3.3控制并发连接数

Nginx内置的limit_conn_zone和limit_conn指令,提供了通过限制ip连接数来控制流量的能力。

其中只有当服务器正在处理请求并且已经读取了整个请求头时,才会计算为有效连接。
对应Nginx模块:ngx_http_limit_conn_module
(1) 控制每个IP的连接数

limit_conn_zone $binary_remote_addr zone=perip:10m;
 
server {       
 
    location /brand {
        # 同一个地址只允许连接2次
        limit_conn perip 2;
        proxy_pass http://192.168.211.1:18081;
    }
     
}

limit_conn_zone $binary_remote_addr zone=perip:10m :表示根据用户的IP地址来进行限制,设置共享内存大小为10M。

limit_conn perip 2 :表示同一个地址只允许连接2次。

(2) 控制与服务器的连接总数

# 根据server_name来限制,存储内存大小10M
limit_conn_zone $server_name zone=perserver:10m;
 
server {
 
    listen 80;
    server_name xx.com;
      
    location / {
        # 限制与服务器的总连接数
        limit_conn perserver 100;
        root   html;
        index  index.html index.htm;
    }
}

limit_conn_zone $server_name zone=perserver:10m :表示根据用户访问的server_name来进行限制,设置共享内存大小为10M。

limit_conn perserver 100 :表示同一个server只允许连接100次。

3.4控制访问速率

设置http请求传输多少字节后开始限速。
对应Nginx模块:ngx_http_core_module

location /flv/ {
    limit_rate_after 500k;
    # 带宽限制,对单个连接限速
    limit_rate       50k;
}

limit_rate_after 500k :表示传输的前500k数据不限速,500k之后再进行限速。

limit_rate 50k :对单个连接限速为50k/s。如果一个客户端发起两个连接,就是50k * 2。

3.5黑白名单

配置固定IP为黑名单,访问时会返回403 Forbidden。
nginx 是按照自上而下的顺序进行匹配,匹配到一个就不往下继续了,如遇到 return 指令时 return 指令还是会生效。

server {
    listen 8080;
    server_name _;
 
    location / {
        allow 192.168.135.1;
        deny all;
        return 200 "$remote_addr 正常访问 3";
    }
}
# 屏蔽单个ip访问
deny IP;
# 允许单个ip访问
allow IP;
# 屏蔽所有ip访问
deny all;
# 允许所有ip访问
allow all;
# 屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令
deny 123.0.0.0/8
# 屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令
deny 124.45.0.0/16
# 屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令
deny 123.45.6.0/24
 
# 也可以通过配置文件来配置
include blockip.conf;

动态黑白名单:也可以采用Lua+Redis实现,将黑名单存入到Redis缓存,每次执行请求时,通过lua脚本先获取用户IP,匹配IP是否属于黑名单,如果是,则不让请求,如果不是,则放行。

 /**
     * provide by zym
     * 0 error(s), 0 warning(s)
     */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/516659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【零基础学web前端】html学习,表格标签,列表标签,表单标签(form和input),无语义标签div与span

前言: 大家好,我是良辰丫,今天我们就开始进入前端知识的学习💞💞 🧑个人主页:良辰针不戳 📖所属专栏:零基础学web前端 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤…

组织学图像弱监督腺体分割的在线简易示例挖掘

文章目录 Online Easy Example Mining for Weakly-Supervised Gland Segmentation from Histology Images摘要本文方法分割 实验结果 Online Easy Example Mining for Weakly-Supervised Gland Segmentation from Histology Images 摘要 背景 开发AI辅助的组织学图像腺体分割方…

DNDC模型在土地利用变化、未来气候变化下的建模方法及温室气体时空动态模拟

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。“十四五”时期,我国生态文明建设进入了以降碳为重点战略方向、推动减污降碳协同增效、促进经济社会发展全面绿色转型、实现生态环境质量改…

除氟树脂,除氟树脂用啥再生,离子交换除氟,矿井水除氟

氟化物选择吸附树脂 Tulsimer CH-87 是一款去除水溶液中氟离子的专用的凝胶型选择性离子交换树脂。它是具有氟化物选择性官能团的交联聚苯乙烯共聚物架构的树脂。 去除氟离子的能力可以达到 1ppm 以下的水平。中性至碱性的PH范围内有较好的工作效率,并且很容易再生…

2023年苹果企业开发者证书申请流程

第一步:注册apple ID,注意,要使用公司官网域名相关的企业邮箱账号注册,前提是公司要有企业邮箱,开通企业邮箱可用163代理的,也可以自己搭建。 第二步:在移动设备上登录该apple ID,并…

.Net中间件的概念---杨中科笔记

什么是中间件? 中间件是ASP.NET Core的核心组件,MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 中间件组成一个管道,整个ASP.NET Core的执行过程就是HTTP请求和响应按照中间件组装的顺序在中间件之间流转的过程。开发人员可…

一种KV存储的GC优化实践

作者:vivo 互联网服务器团队- Yuan Jian Wei 从内部需求出发,我们基于TiKV设计了一款兼容Redis的KV存储。基于TiKV的数据存储机制,对于窗口数据的处理以及过期数据的GC问题却成为一个难题。本文希望基于从KV存储的设计开始讲解,到…

MySQL 高级(进阶) SQL 语句三 存储过程

1.1 什么是存储过程 存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它…

中国物种物候和地面物候数据获取方法

物候学是研究自然界的植物(包括农作物)、动物和环境条件(气候、水文、土壤条件)的周期变化之间相互关系的科学。它的目的是认识自然季节现象变化的规律,以服务于农业生产和科学研究。 [3-4] 物候既可指生物的周期性…

从0到1复现斯坦福羊驼(Stanford Alpaca 7B)

近日,Meta开源了他们的LLaMA系列模型,包含了参数量为7B/13B/33B/65B的不同模型,然而,原模型的效果较差(如生成的结果文不对题、以及无法自然地结束生成等)。因此,斯坦福的 Alpaca 模型基于 LLaM…

基于AT89C51单片机的简易电梯上下楼层间移动系统

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87776511?spm1001.2014.3001.5503 源码获取 主要内容: 采用单片AT89C51芯片进行电梯控制系统的设计方法,主要阐述如何使用单机进行编程来实…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 7 Clustering

来源:《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 7 Clustering The requirements for a function on pairs of points to be a distance measure are that: Distances are always nonnegative, and only the distance between a point and itse…

泰克示波器MSO54B 5-BW-1000,4通道1G带宽

泰克MSO5B系列示波器,支持广泛的特定应用测量,满足您的各种需求。单独添加高级分析程序包或安装应用程序包,以处理更多不同的工作。 支持超过 25 种串行协议,覆盖常见的接口先进的单相和三相功率分析程序包确保信号完整性和电源完…

邮件系统市场行情分析

前言 随着网络信息化的不断发展,邮件系统也日益成为企业对外沟通交流的重要工具,成为了企业的刚需。随着邮件系统技术的不断完善与发展,企业对于邮件系统功能的也提出了更高的要求。市面上逐渐诞生了众多的品牌和厂家。不同的厂家在系统的功能…

HummerRisk 常见问题 (一)

本文汇总了一些 HummerRisk 使用过程中的常见问题,希望可以帮助大家快速排查和解决问题,更加顺畅的使用 HummerRisk 云原生安全平台。 安装问题 Q.安装过程中,Docker 检测失败? A. 默认情况下,使用 HummerRisk 安装脚…

已知 IP 地址是 128.14.35.7/20。求网络地址

首先知道公式 然后我们由 128得出这个是B类IP地址 默认是16位1 但是 所给IP已经给了 掩码长度 所以求出了就知道 掩码 就可以求出了

MySQL学习---12、视图

1、常见的数据库对象 对象描述表(Table)表时存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是字段数据字典就是系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护,程序员通常不应该修改&…

银河麒麟系统Arm64编译opencv指南

进入opencv官网下载版本;我这边下载的是2.4.13.6 ;根据需要下载最新的 Releases - OpenCV 拷贝进麒麟系统我这边是麒麟V10 sp1 2204;并解 cmake 在麒麟应用商城中安装; 打开cmake 设置opencv路径;builder文件夹可以自…

福音:IDEA、VSCODE神级插件Bito

文章目录 Bito是什么?IDEA环境安装注册使用 VSCODE环境疑难问题后叙 Bito是什么? Bito是一款在编程软件中使用的插件,由ChatGPT团队开发,它是ChatGPT团队为了提高开发效率而开发的一款工具。 Bito的AI帮助开发人员极大地提高了其…

【已解决】windows电脑上无法打开iPhone中的照片

出门旅游后,想必很多小伙伴的手机里都会存下一大堆照片,回来后想直接导入Windows查看筛选,可有些人会发现无法显示图片的内容,提示不支持该格式或文件损坏,这是为什么呢? 这是因为用iPhone手机的话&#xf…