【个人博客搭建】(16)速率限制

2024-05-01 05:36

本文主要是介绍【个人博客搭建】(16)速率限制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

速率限制是一种防止操作频率超过既定限制的技术手段,它的主要作用是保护系统资源和服务的稳定性。具体如下:

  • 保护系统资源:通过限制客户端在特定时间内可以发起的请求数量,速率限制确保了系统资源不会被过度消耗。这对于维护系统的长期稳定性和可靠性至关重要。
  • 防御恶意行为:速率限制能够减缓或阻止恶意用户对系统进行拒绝服务(DoS)攻击,这种攻击通常是通过发送大量请求来耗尽系统资源,导致合法用户无法访问服务。
  • 提高服务质量:对于公开的API或Web服务,速率限制可以防止单个用户占用过多资源,从而确保所有用户都能获得公平的服务体验。
  • 防止滥用:速率限制可以防止用户进行潜在的滥用行为,如暴力破解密码攻击,通过限制对特定URI的访问频率,可以有效减缓这类攻击的速度和成功率。
  • 流量管理:在一些网络设备和软件中,速率限制也被用作流量管理的工具,以确保网络流量的平稳和合理分配。

综上所述,速率限制在现代网络系统中发挥着重要作用,它不仅保护了系统免受过载的风险,还提供了一种机制来平衡和公平地分配资源。

1、引入命名空间。(不用下载其他包,net8自带,net6就需要AspNetCoreRateLimit,现在查看也可以看到还没有net8版本的依赖)

using Microsoft.AspNetCore.RateLimiting;
using System.Threading.RateLimiting;

2、配置文件。

        这里我同之前数据库DBS配置一样,使用的数组,方便后续拓展其他类型

  /* 速率限制配置 */"MyRateLimit": [{"PolicyName": "fixed", //策略 AddFixedWindowLimiter (目前代码配置也只使用这个)"PermitLimit": 10, //请求上限"Window": 1, //每多少秒"QueueLimit": 2}]

3、创建模型

public class MyRateLimitConfig
{/// <summary>/// 策略名称/// </summary>public string PolicyName { get; set; }/// <summary>/// 请求上限/// </summary>public int PermitLimit { get; set; }/// <summary>/// 每多少秒的值/// </summary>public int Window { get; set; }/// <summary>/// 最多允许有多少个请求排队等待处理/// </summary>public int QueueLimit { get; set; }/// <summary>/// 该类在json配置文件中的名称/// </summary>public static string MyRateLimit = "MyRateLimit";
}

4、读取配置信息

List<MyRateLimitConfig> myRateLimitList = AppSettings.app<MyRateLimitConfig>(MyRateLimitConfig.MyRateLimit).ToList();
var myRateLimit = myRateLimitList.FirstOrDefault();

5、核心代码

//AddFixedWindowLimiter 方法使用固定的时间窗口来限制请求。 当时间窗口过期时,会启动一个新的时间窗口,并重置请求限制。
builder.Services.AddRateLimiter(_ => _.AddFixedWindowLimiter(policyName: "fixed", options =>{options.PermitLimit = myRateLimit.PermitLimit;options.Window = TimeSpan.FromSeconds(myRateLimit.Window);options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;options.QueueLimit = myRateLimit.QueueLimit;}));

app.UseRateLimiter();

6、使用

        可以使用在控制器上边,也可以加在action接口上。或者默认全部接口都带入

        这里我们在接口登录上边使用

/// <summary>
/// 登录
/// </summary>
/// <param name="para">入参</param>
/// <returns></returns>
[ApiVersionCustomRoute("Login", SwaggerDocSettings.ApiVersions.v1)]
[EnableRateLimiting("fixed")] //速率限制特性
[HttpPost]
public async Task<ApiResult> GetUser(LoginUserParameters para)

7、测试

        这里我们使用apipost的一键压测功能测试

        7.1、不使用:

                看下图,我们的所有请求都是可以通过的。

        7.2、使用:

        看下图。只成功运行了100条数据。这也就是我们前边配置文件中所设置的1秒10条。这里一共10秒,所以也就是10*10 =100。需要更具体的可以在apipost上开启日志记录进行查看。

8、其他

        8.1、本文参考官方:ASP.NET Core 中的速率限制中间件 | Microsoft Learn

        8.2、这里只使用了其中一种方案,还有几种可以自行拓展。

        8.3、之前查询资料的时候也看到了些其他方案,自建限流,使用特性标注 。(主要逻辑就是使用缓存存储ip地址的访问次数,配置文件配置每秒上限)。

9、推荐阅读

【个人博客搭建】(15)Redis缓存使用-CSDN博客

这篇关于【个人博客搭建】(16)速率限制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950827

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参