首页 > 系统相关 >NGINX的漏桶算法限流与gateway的令牌桶算法限流

NGINX的漏桶算法限流与gateway的令牌桶算法限流

时间:2024-09-12 17:48:51浏览次数:10  
标签:令牌 请求 zone NGINX 算法 限流 limit

简单来讲漏桶算法与令牌桶算法的区别

漏桶算法是指请求会打入到一个“桶”中,桶会以一定速率将请求递交下去。当请求过多的时候,桶内会积累请求等待递交;当请求积累超过桶的大小时,请求就会向水满的桶一样溢出(被桶抛弃)

令牌桶算法是指桶会以固定的速率生成令牌并存入桶中,桶满后会暂停生成,当请求打过来的时候会去桶中申请令牌,只有携带令牌的请求才能顺利递交。不携带令牌的请求会被阻塞/抛弃

漏桶算法处理请求会更加平滑稳定,而令牌桶算法处理请求波动会比较高;

在面对突发情况时,令牌桶算法可以更好的接住并处理请求(秒杀等短时间高并发现象)

NGINX的漏桶限流具有两种方法:

1.控制速率

语法limit_req_zone key zone rate

  • key定义了限流对象。
    • $binary_remote_addr就是其中一种key,基于客户端IP限流。
    • $server_name基于请求的服务器限流,不太常用;
    • $url/#requeset_url基于请求URL限流,当URL包含查询参数时可能会导致大量的key,也不常用
  • Zone:定义了共享存储区来存储访问信息,下述例子中定义了存储区域名为one,并为其分配了10M的存储空间.即zone=存储空间名:存储大小
  • rate:定义了最大访问速率,例如rate=10m/s表示每秒最多请求10个请求
  • burst,指定桶的大小,超过桶的存储就会被丢弃
  • nodelay:快速处理

语法 limit_req_status 指定当请求被返回时会返回HTTP状态码为429

 举例:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=12r/m;
    limit_req_status 429;
    server {
        location / { #这里是指为所有请求都添加了下述内容
            limit_req zone=one burst=20 nodelay; #这里是为了启用上述限流区域名为one的漏桶
        }
}

2.控制并发数

这里主要是limit_req_zone改成limit_conn_zone

$binary_remote_addr:表示一个ip最多只能持有多少链接

$server_name:表示一个服务器最多支持同时处理多少并发链接

举例

http{
      limit_conn_zone $binary_remote_addr zone=perip:20m;
      limit_conn_zone $server_name zone=perserver:10m;        
      server{
           location / {
                  limit_conn perip 20; 
                  limit_conn perserver 100; 
          }  
    }  
}    

spring cloud gateway的令牌桶限流算法:

首先令牌桶算法默认基于redis,也就是说需要在gateway配置上redis后才可以使用

在微服务路由的yaml配置中添加局部过滤器RequestRateLimiter

server:
  port: 63010 # 网关端口
spring:
  cloud:
    gateway:
      routes: # 网关路由配置
        - id: content-api # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://content-api # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/content/** # 这个是按照路径匹配,只要以/content/开头就符合要求
     filters:
            - name:RequestRateLimiter
              args:
                 key-resolver: '#{@pathKeyResolver}' # 使用spEL从容器中取对象
                 redis-rate-limiter.replenishRate: 1 # 令牌桶每秒填充平均速率
                 redis-rate-limiter.burstCapacity: 3 # 令牌桶的上限
  redis:
    host: x.x.x.x
    port: 6379

关于@pathKeyResolver,下述例子使用HTTP请求作为key,在redis中存储并检索速率限制信息

@Configuration  
public class GatewayConfig {  
  
    @Bean  
    public KeyResolver myKeyResolver() {  
        return exchange -> Mono.just(exchange.getRequest().getPath().value());  
    }  
}

 

标签:令牌,请求,zone,NGINX,算法,限流,limit
From: https://www.cnblogs.com/kun1790051360/p/18410709

相关文章

  • 安防监控视频平台LntonAIServer对比度检测算法:提升视频监控质量的关键
    LntonAIServer对比度检测算法是安防监控视频平台中的一种高级功能,用于确保视频图像质量的一致性和清晰度。以下是对这一算法的详细分析:1.算法定义与重要性 -定义:对比度检测算法用于评估图像各部分之间的差异程度。 -重要性:对比度对于视频内容的清晰度和细节表现至关重......
  • Python 和 Go 实现 AES 加密算法的技术详解
    AES(AdvancedEncryptionStandard,高级加密标准)是一种对称密钥加密算法,广泛应用于各种安全通信场景中。AES使用128、192或256位的密钥,能够提供不同级别的安全性。本文将详细讲解如何使用Python和Go来实现AES加密算法,提供代码示例并对其进行逐步解析。1.什么是AES加密......
  • 文心一言 VS 讯飞星火 VS chatgpt (345)-- 算法导论23.2 4题
    四、假定图中的边权重全部为整数,且在范围内。在此种情况下,Kruskal算法最快能多快?如果边的权重取值范围在1到某个常数之间呢?如果要写代码,请用go语言。文心一言:首先,我们探讨Kruskal算法在不同条件下的性能表现,并给出基于Go语言的实现。1.当边权重全部在范围内时在这种情况下,边的权重......
  • Yolo第Y1周:详解YOLO检测算法的训练参数
    目录Yolo第Y1周:详解YOLO检测算法的训练参数Yolo第Y1周:详解YOLO检测算法的训练参数......
  • Yolo第Y2周:如何正确解读YOLO算法训练结果的各项指标
    目录Yolo第Y2周:如何正确解读YOLO算法训练结果的各项指标weights文件夹:最终的仙丹results.png:训练总图要略loss系列:打明牌的能力box_loss边界框损失:衡量画框cls_loss分类损失:判断框里的物体dfl_loss分布式焦点损失:精益求精验证集:学得好,不一定考得好精度和召回率:又准又全的考量r......
  • Ethereum学习笔记 ---- 多重继承中的 C3线性化算法
    目录举个反例分析错误原因举个正例分析solidity中的多重继承多重继承合约的storagelayout学习solidity合约多重继承时,官方文档介绍solidity采用C3线性化算法来确定多重依赖中的继承顺序。维基百科上有很好的说明:C3线性化C3linearization下面通过实验来深入理解一下......
  • APA(自动泊车辅助系统)_路径规划算法(A_算法)
    APA(自动泊车辅助系统):路径规划算法(A*算法)前言A*算法在网上有许多讲解,各种各样的版本都有,包括“文档”或者“视频”的形式都能够找到,这些讲解中都是作者基于作者个人的理解进行的,其中对算法的理解难免有出入,这就导致了后来者往往学习后出现“稀里糊涂”的感觉,这其中就......
  • 互联网算法备案必要性+攻略全流程详解【附件+流程】
    一、算法备案的重要性算法备案是指相关企业或组织向有关部门提交其使用的算法的相关信息,以接受监管和审查。这一举措有助于确保算法的公正性、透明性和合法性,保护用户的权益,促进数字经济的健康发展。算法备案必要性强制性例如,在推荐系统中,如果算法存在偏见或歧视,可能会导致......
  • 多模态大语言模型综述(中)-算法实用指南
    IV.算法实用指南多模态的算法可分为两类:基础模型和大规模多模态预训练模型。基础模态是多模态的基本框架,许多新的大规模多模态预训练模型都是基于它进行改进的。下图是论文涉及的算法清单,含模型名字、年份、技术要点、功能及参考编号,以及代码开源情况。如果您也对A......
  • 【大数据】聚类算法
    目录一、聚类算法概述二、聚类算法优缺点和改进2.1 聚类算法优点2.2聚类算法缺点2.3 聚类算法改进三、聚类算法实现3.1 聚类算法C语言实现3.2 聚类算法JAVA实现3.3 聚类算法python实现四、聚类算法应用五、聚类算法发展趋势一、聚类算法概述      ......