apisix~限流插件的使用

news/2024/11/14 19:58:06/文章来源:https://www.cnblogs.com/lori/p/18546656

参考:

  • https://i4t.com/19399.html
  • https://github.com/apache/apisix/issues/9193
  • https://github.com/apache/apisix/issues/9830
  • https://apisix.apache.org/docs/apisix/plugins/limit-conn/
  • https://blog.frankel.ch/different-rate-limits-apisix/

在 Apache APISIX 中,限流共提供了三种方式,下面说一下

  • limit-req 插件使用漏桶算法限制单个客户端对服务的请求速率
  • limit-conn 插件用于限制客户端对单个服务的并发请求数。当客户端对路由的并发请求数达到限制时,可以返回自定义的状态码和响应信息。
  • limit-count 件使用固定时间窗口算法,主要用于限制单个客户端在指定的时间范围内对服务的总请求数,并且会在 HTTP 响应头中返回剩余可以请求的个数。该插件原理与 GitHub API 的速率限制类似

请求的限制参数

key_type

  • ["var", "var_combination"]
  • var就是一个变更,不需要加$前缀
  • var_combination是一组变更的组合,如key为:$http_sub $http_x_forwarded_for

key

  • ["remote_addr", "server_addr", "http_x_real_ip", "http_x_forwarded_for", "consumer_name"]
  • 如果限流标识是在请求头里,如请求头是sub,那么key可以配置为http_sub

var和var_combination类型对应的配置

  • var_combination
"plugins": {
"limit-req": {"burst": 10,"key": "$consumer_name $remote_addr","key_type": "var_combination","rate": 2,"rejected_code": 502
}
}
  • var
"plugins": {"limit-req": {"burst": 2,"key": "remote_addr","key_type": "var","rate": 3,"rejected_code": 502},"limit-count": {"allow_degradation": false,"count": 5,"key": "http_sub","key_type": "var","policy": "local","rejected_code": 429,"rejected_msg": "请求太多了","show_limit_quota_header": true,"time_window": 60}
}

配置redis

  • redis中key的组成plugin-limit-countroute540160115966214871:2389086815:347c9e9e-076c-45e3-be74-c482fffcc6e5
    • plugin-插件名route路由id::limit里的key值
  • 单节点
"plugins": {"limit-count": {"count": 2,"time_window": 60,"rejected_code": 503,"key": "remote_addr","policy": "redis","redis_host": "127.0.0.1","redis_port": 6379,"redis_password": "password","redis_database": 1,"redis_timeout": 1001}
}
  • 集群模式
"plugins": {"limit-count": {"count": 2,"time_window": 60,"rejected_code": 503,"key": "remote_addr","policy": "redis-cluster","redis_cluster_nodes": ["127.0.0.1:5000","127.0.0.1:5001"]}
}

插件的解释

  • limit-req
rate:含义:每秒允许的请求数量。示例:rate: 3 表示每个客户端(根据配置的 key)每秒最多可以发送 3 个请求。burst:含义:突发请求的最大数量。示例:burst: 2 表示在短时间内,客户端可以突发额外的 2 个请求,即在正常速率为 3 的情况下,可以在某些时刻达到 5 个请求(3 + 2)。
  • limit-count
count:含义:在指定的时间窗口内允许的最大请求次数。示例:count: 2 表示每个客户端(根据配置的 key)在 time_window 指定的时间段内最多可以发送 2 个请求。time_window:含义:时间窗口的长度,以秒为单位。示例:time_window: 60 表示时间窗口为 60 秒。在这 60 秒内,客户端最多可以发送 2 个请求。

对redis-key的解释

在 APISIX 中使用 limit-count 插件时,生成的 Redis 键通常包含多个部分,这些部分用来标识具体的限流策略和相关信息。你提到的键示例是:

plugin-limit-countroute540160115966214871:2389086815:347c9e9e-076c-45e3-be74-c482fffcc6e5

我们可以将这个键分解为几个部分以便理解:

键的组成部分

  1. plugin-limit-count

    • 这是固定的前缀,表示该键是由 limit-count 插件生成的。
  2. route540160115966214871

    • 这一部分通常表示与特定路由(route)相关的信息。
    • 540160115966214871 是路由的唯一标识符(ID),它对应于 APISIX 中配置的某个具体路由。这使得限流策略能够应用于特定的路由。
  3. 2389086815

    • 这一部分通常表示限流的维度或时间窗口的标识符,可能是一个时间戳或者是请求计数的某一部分。
    • 具体含义取决于你的限流配置,比如它可能是用于区分不同时间段内的请求计数。
  4. 347c9e9e-076c-45e3-be74-c482fffcc6e5

    • 这一部分一般是用户标识符(如客户端 ID 或者其他唯一标识符),用于在限流策略中区分不同的用户或客户端。
    • 这种设计允许对不同的用户或客户端分别进行限流控制。

总结

整个键的结构是为了确保每个限流实例都是唯一的,并且能够精确地与特定的路由和用户关联。通过这样的设计,APISIX 可以高效地管理和应用限流策略,以保障系统的稳定性和性能。

redis-count和redis-req的使用场景

漏桶算法(Leaky Bucket)和固定窗口限流(Fixed Window)是两种常见的限流策略,它们适用于不同的使用场景。以下是这两种限流策略的特点及其适用场景:

漏桶算法(Leaky Bucket)

特点:

  • 平滑输出:漏桶算法允许请求以固定速率被处理,尽管输入请求可以是不规则的。
  • 水位限制:桶内有一个容量限制,当达到上限时,多余的请求将被丢弃或拒绝。
  • 时间延迟:由于请求是以固定速率“漏出”的,因此可能会引入一定的延迟。

使用场景:

  1. 网络流量控制:适合需要平稳流量输出的场景,如视频流、音频流等。
  2. API调用限制:在需要防止突发流量对后端服务造成影响的情况下,可以使用漏桶算法来平衡请求量。
  3. 实时数据处理:适合处理实时数据流的场景,例如消息队列中的消息消费。
  4. 用户行为限制:例如限制用户在一定时间内的操作次数,以防止刷票、刷单等行为。

固定窗口限流(Fixed Window)

特点:

  • 时间窗口:将时间划分为固定长度的窗口,在每个窗口内允许一定数量的请求。
  • 突发性:在窗口开始时,所有请求都可以瞬间进入,但在窗口结束前不会再接受新的请求,直到下一个窗口开始。
  • 简单易实现:相对其他限流算法,固定窗口的实现较为简单。

使用场景:

  1. 日常访问控制:适合控制用户在特定时间段内的访问频率,比如限制用户每天的登录次数。
  2. API接口调用:用于限制外部系统对内部API的调用频率,确保系统稳定性。
  3. 短时间高并发场景:如电商促销活动期间,可以快速处理大量请求,但需要限制每个用户的请求频率。
  4. 统计分析:适合进行简单的统计计算,如记录某一时间窗口内的访问量。

总结

  • 漏桶算法更适合需要平滑流量控制的场景,能够有效防止突发流量造成的系统压力。
  • 固定窗口限流则适合短时间内的请求控制,简单易用,适合一些对时间窗口要求不严格的应用。

根据具体的业务需求和系统架构,可以选择合适的限流策略来保障系统的稳定性和可用性。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目冲刺11.14

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 作业要求这个作业的目标 进行为期七天的项目冲刺并记录前言 本篇博客是项目冲刺的第六篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客第七篇博客团队简介队名 拖延是你不…

研途无忧Alpha冲刺第二天

Alpha冲刺dya2 研途无忧-冲刺日志(第二天) 进度表成员 完成的任务 完成的任务时长 剩余时间马鑫 小研帮部分页面的前端设计、部分工作安排与调整、冲刺日志的撰写 4h 14h王强 小研帮部分页面的前端设计、小研帮数据库的完善、相关云函数的设计 4h 14h黄昕怡 研小fu性格的切换…

K-Means聚类分析以及误差平方和SSE(Python实现)

代码介绍 使用 make_blobs 函数生成一个二维的随机数据集,包含120个样本和3个中心。生成的数据将用于后续的聚类分析。 数据生成后,通过散点图可视化这些点,展示不同的聚类中心。 定义了一个函数 calculate_sse,用于计算给定聚类数 k 时的误差平方和(SSE)。该函数使用K-M…

数字孪生如何赋能智慧能源?揭秘技术背后的核心价值

随着能源行业不断向智能化、数字化转型,数字孪生技术在智慧能源项目中扮演的角色愈发重要。数字孪生不仅带来了前所未有的资源优化和成本节约方式,还为整个能源系统的可持续运营奠定了坚实基础。那么,为什么数字孪生技术在智慧能源项目中如此不可或缺?下面我就从可视化从业…

激活函数

一、正向传播和反向传播在模型训练过程中,是同时包含正向传播和反向传播的正向传播是模型根据输入数据和当前的参数(权重和偏置)计算预测输出的过程。例如,在一个图像分类神经网络模型中,输入是图像的像素数据,经过多个隐藏层的计算,最终在输出层得到预测的类别概率分布…

centOS7 docker 安装步骤

一、安装前检查工作: 1.检查/etc/yum.repos.d/CentOS-Base.repo文件是否存在,如果不存在,从网络仓库中复制一份新的 CentOS-Base.repo 文件。 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 或者使用 wget: sudo wget -O /…

k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储

目录docker registry 部署生成 htpasswd 文件生成 secret 文件生成 registry 配置文件创建 service创建 statefulset创建 ingress验证 docker registrydocker registry 监控docker registry uidocker registry dockerfile docker registry 配置文件 S3 storage driver registry…

[68] (炼石计划) NOIP 模拟赛 #20

学了一个挺帅的 MerMaid 所以用一下 flowchart TBA(邻间的骰子之舞)style A color:#ffffff,fill:#00c0c0,stroke:#ffffff 考虑每次复制以后一定会粘贴若干次(大于零,否则没有意义),因此将复制粘贴捆绑起来考虑,设复制后连续粘贴了 \(m\) 次,则代价为 \(x+my\),贡献为让编…

团队项目Scrum冲刺-day4

一、每天举行站立式会议 站立式会议照片一张昨天已完成的工作成员 任务陈国金 用户模块接口开发凌枫 整合MD编辑器陈卓恒 完成管理题目页面谭立业 完成题目搜索页面廖俊龙 接口测试曾平凡 前端页面测试曾俊涛 完成题目模块接口开发薛秋昊 完成题目提交模块接口开发今天计划完成…

【闲话】先觉

题图太大了,遂放到里面了能 窥探 到未来的 命运 又怎样? 不愿向 命运 屈服,自以为一次次地“战胜” 命运 后却不知一切都是 命运 早就 安排 好的。亦或是他即是 命运 的代理人。 不久后的 毁灭 已成为他的梦魇,面对好友的一个个离去他 无能为力 ,只好请求 那位大人 伸出援…

团队作业4——项目冲刺-4

团队作业4——项目冲刺-4信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 在七天敏捷冲刺中,完成工大严选开发,记录每日进展和问题,更新燃尽图、签入代码,并发布集合日志总结成果GitHub链接 GitHub一、团队简介队名:小飞棍队团队成员:姓名 学号罗…

MX 2025--炼石计划 NOIP 模拟赛 #20

斥责打得抽象。T3,T4放俩难的板子。由于是MX的题,就不放题意了。 邻间的骰子之舞 发现复制操作不会超过\(64\)次,而粘贴操作肯定是越均匀越好,直接二分暴力跑就行了。点此查看代码 #include<bits/stdc++.h> using namespace std; #define rep(i,s,t,p) for(int i = s;…