基于 ActionFilters 的限流库DotNetRateLimiter使用
前言
在构建API项目时,有时出于安全考虑,防止访问用户恶意攻击,希望限制此用户ip地址的请求次数,减轻拒绝服务攻击可能性,也称作限流。接下来,我们就来学习开源库DotNetRateLimiter 如何轻松实现限流。
项目使用配置
安装Nuget包
在新建立的WebAPI项目中,通过Nuget包管理器安装DotNetRateLimiter,安装命令:
NuGet\Install-Package DotNetRateLimiter -Version 1.0.7
项目服务注入
using DotNet.RateLimiter;
var builder = WebApplication.CreateBuilder(args);
//DotNetRateLimiter配置
builder.Services.AddRateLimitService(builder.Configuration);
DotNetRateLimiter 配置:
appsetting.json 文件中,添加JSON对象节点进行配置,如下:
"RateLimitOption": {
"EnableRateLimit": true, //是否开启
"HttpStatusCode": 429,//http响应码
"ErrorMessage": "请求次数过多", //响应信息
"IpHeaderName": "X-Forwarded-For",//客户端IP请求头
//"RedisConnection": "127.0.0.1:6379", 默认使用内存缓存,并且支持配置 Redis 连接, 这样可以对分布式应用进行限流。
"IpWhiteList": ["::1"], //设置白名单集合
"ClientIdentifier": "X-Client-Id"
}
到此配置已经完成,非常简单,接下就是在项目中如何进行使用。
项目中使用
控制器Controller上使用
这个控制器20秒内只允许 3 个请求, 如果调用 api 超过 3 次,就会收到http错误请求代码: 429,错误信息:请求次数过多
[Route("api/[controller]")]
[ApiController]
[RateLimit(PeriodInSec = 20, Limit = 3, Scope = RateLimitScope.Controller)]//控制器上使用
public class RateLimiterController : ControllerBase
{
}
接口Action上使用
这个接口20秒内只允许 3 个请求, 如果调用 api 超过 3 次,就会收到http错误请求代码: 429,错误信息:请求次数过多
/// <summary>
/// 添加RateLimit接口特性
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("GetNow")]
[RateLimit(PeriodInSec = 20, Limit = 3)]
public ActionResult GetNow()
{
return Ok(
new
{
Msg = "当前时间",
Value = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")
}
);
}
/// <summary>
/// 不添加RateLimit特性接口
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("GetYesteyDayNow")]
public ActionResult GetYesteyDayNow()
{
return Ok(
new
{
Msg = "昨天时间",
Value = DateTime.Now.AddDays(-1).ToString("yyyy/MM/dd HH:mm:ss")
}
);
}
/// <summary>
/// RateLimit特性结合路由参数接口
/// </summary>
/// <param name="day"></param>
/// <returns></returns>
[HttpGet]
[Route("GetBeforeTimeByDay/{day}")]
[RateLimit(PeriodInSec = 20, Limit = 3, RouteParams = "day")]//搭配路由进行使用
public ActionResult ActionResult(int day)
{
return Ok(
new
{
Msg = $"{day}天前时间",
Value = DateTime.Now.AddDays(-day).ToString("yyyy/MM/dd HH:mm:ss")
}
);
}
测试验证
打开Swagger,调用接口测试:


基于 ActionFilters 的限流库DotNetRateLimiter使用的更多相关文章
- 基于Redis的限流系统的设计
本文讲述基于Redis的限流系统的设计,主要会谈及限流系统中限流策略这个功能的设计:在实现方面,算法使用的是令牌桶算法来,访问Redis使用lua脚本. 1.概念 In computer netw ...
- 一段基于Redis-SortedSet的限流代码
[HttpGet] public async Task<ActionResult<string>> Get() { //限流周期:5秒 int period = 5; //周期 ...
- spring中实现基于注解实现动态的接口限流防刷
本文将介绍在spring项目中自定义注解,借助redis实现接口的限流 自定义注解类 import java.lang.annotation.ElementType; import java.lang ...
- Zuul【限流】
在项目中,大部分都会使用到hyrtrix做熔断机制,通过某个预定的阈值来对异常流量进行降级处理,除了做服务降级以外,还可以对服务进行限流,分流,排队等. 当然,zuul也能做到限流策略,最简单的方式就 ...
- Spark Streaming数据限流简述
Spark Streaming对实时数据流进行分析处理,源源不断的从数据源接收数据切割成一个个时间间隔进行处理: 流处理与批处理有明显区别,批处理中的数据有明显的边界.数据规模已知:而流处理数 ...
- .NET6运行时动态更新限流阈值
昨天博客园撑不住流量又崩溃了,很巧正在编写这篇文章,于是产生一个假想:如果博客园用上我这个限流组件会怎么样呢? 用户会收到几个429错误,并且多刷新几次就看到了内容,不会出现完全不可用. 还可以降低查 ...
- 微服务SpringCloud之GateWay熔断、限流、重试
纯洁的微笑的Spring Cloud系列博客终于学完了,也对Spring Cloud有了初步的了解. 修改请求路径的过滤器 StripPrefix Filter 是一个请求路径截取的功能,我们可以利用 ...
- springcloud(十七):服务网关 Spring Cloud GateWay 熔断、限流、重试
上篇文章介绍了 Gataway 和注册中心的使用,以及 Gataway 中 Filter 的基本使用,这篇文章我们将继续介绍 Filter 的一些常用功能. 修改请求路径的过滤器 StripPrefi ...
- Alibaba Sentinel 限流与熔断初探(技巧篇)
目录 1.Sentinel 是什么 ?主要能解决什么问题? 2.限流与熔断的使用场景 3.Sentinel 源码结构 4.在 IntelliJ IDEA 中运行 Sentine Demo 温馨提示:源 ...
- 【高并发】亿级流量场景下如何为HTTP接口限流?看完我懂了!!
写在前面 在互联网应用中,高并发系统会面临一个重大的挑战,那就是大量流高并发访问,比如:天猫的双十一.京东618.秒杀.抢购促销等,这些都是典型的大流量高并发场景.关于秒杀,小伙伴们可以参见我的另一篇 ...
随机推荐
- ABP - 缓存模块(1)
1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching ,而对于分布式缓存的支持,abp 官方提供了基于 Redis 的方案,需要安装 Vo ...
- DOS系统中EXE程序加载过程
1.在内存区中寻找一段容量足够的空闲内存区. 2.这段内存区的前256字节中,创建一个称为程序段前缀(PSP)的数据区. 3.这段内存区256字节之后,将程序装入,程序的地址被设为SA+10H : 0 ...
- 明解STM32—GPIO应用设计篇之IO外部中断EXTI原理及使用方法
一.前言 在之前针对STM32的GPIO相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读信号引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取检测操作,除了轮询的 ...
- Vulhub靶场的搭建
Vulhub靶场的搭建(基于centos7) 1>简述 很多人在搭建Vulhub靶场的时候,可能也搜到过许多的文章,但是大多数的文章只是有一个流程,对其中的原理,步骤没有进行详细的说明,这也就导 ...
- 深入浅出MySQL - 架构与执行
Photo by Merilin Kirsika Tedder from Pexels 一.MySQL的逻辑架构 MySQL作为一个流行的开源关系型数据库管理系统,它可以运行在多种平台上,支持多种存储 ...
- 在命令行按下tab键之后, 发生了生么?
1. 引言 2. complete命令 3. 自定义补全列表 4. 动态补全列表 5. compgen命令 6. 别名的自动补全 7. 补全规则永久生效 8. 自动加载 9. 参考 1. 引言 当我们 ...
- 驱动开发:内核远程线程实现DLL注入
在笔者上一篇文章<内核RIP劫持实现DLL注入>介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过NtCreateThreadEx这个内核函数实 ...
- linux grep基本用法--九五小庞
通过此语句可以查询一个文件或者当前目录下所有文件中包含exception和error的文件 grep -E -i "((exception)|(error))" * 1.查找文件中 ...
- Github的一个彩蛋
点击新建仓库 项目名称为自己的昵称 下方提示意思说: 你发现了一个秘密 这是一个特别的仓库 你可以为你的首页增加README.md 就像给项目介绍一样,这是你的自我介绍 点击编辑,里面会与建议模板 以 ...
- 深入JS——理解闭包可以看作是某种意义上的重生
JS中有一个非常重要但又难以完全掌握的概念,那就是闭包.很多JS程序员自以为已经掌握了闭包,但实质上是一知半解,就像"JS中万物皆为对象"这个常见的错误说法一样,很多前端开发者到现 ...