前言

在构建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使用的更多相关文章

  1. 基于Redis的限流系统的设计

    本文讲述基于Redis的限流系统的设计,主要会谈及限流系统中限流策略这个功能的设计:在实现方面,算法使用的是令牌桶算法来,访问Redis使用lua脚本.   1.概念 In computer netw ...

  2. 一段基于Redis-SortedSet的限流代码

    [HttpGet] public async Task<ActionResult<string>> Get() { //限流周期:5秒 int period = 5; //周期 ...

  3. spring中实现基于注解实现动态的接口限流防刷

    本文将介绍在spring项目中自定义注解,借助redis实现接口的限流 自定义注解类 import java.lang.annotation.ElementType; import java.lang ...

  4. Zuul【限流】

    在项目中,大部分都会使用到hyrtrix做熔断机制,通过某个预定的阈值来对异常流量进行降级处理,除了做服务降级以外,还可以对服务进行限流,分流,排队等. 当然,zuul也能做到限流策略,最简单的方式就 ...

  5. Spark Streaming数据限流简述

      Spark Streaming对实时数据流进行分析处理,源源不断的从数据源接收数据切割成一个个时间间隔进行处理:   流处理与批处理有明显区别,批处理中的数据有明显的边界.数据规模已知:而流处理数 ...

  6. .NET6运行时动态更新限流阈值

    昨天博客园撑不住流量又崩溃了,很巧正在编写这篇文章,于是产生一个假想:如果博客园用上我这个限流组件会怎么样呢? 用户会收到几个429错误,并且多刷新几次就看到了内容,不会出现完全不可用. 还可以降低查 ...

  7. 微服务SpringCloud之GateWay熔断、限流、重试

    纯洁的微笑的Spring Cloud系列博客终于学完了,也对Spring Cloud有了初步的了解. 修改请求路径的过滤器 StripPrefix Filter 是一个请求路径截取的功能,我们可以利用 ...

  8. springcloud(十七):服务网关 Spring Cloud GateWay 熔断、限流、重试

    上篇文章介绍了 Gataway 和注册中心的使用,以及 Gataway 中 Filter 的基本使用,这篇文章我们将继续介绍 Filter 的一些常用功能. 修改请求路径的过滤器 StripPrefi ...

  9. Alibaba Sentinel 限流与熔断初探(技巧篇)

    目录 1.Sentinel 是什么 ?主要能解决什么问题? 2.限流与熔断的使用场景 3.Sentinel 源码结构 4.在 IntelliJ IDEA 中运行 Sentine Demo 温馨提示:源 ...

  10. 【高并发】亿级流量场景下如何为HTTP接口限流?看完我懂了!!

    写在前面 在互联网应用中,高并发系统会面临一个重大的挑战,那就是大量流高并发访问,比如:天猫的双十一.京东618.秒杀.抢购促销等,这些都是典型的大流量高并发场景.关于秒杀,小伙伴们可以参见我的另一篇 ...

随机推荐

  1. ABP - 缓存模块(1)

    1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching ,而对于分布式缓存的支持,abp 官方提供了基于 Redis 的方案,需要安装 Vo ...

  2. DOS系统中EXE程序加载过程

    1.在内存区中寻找一段容量足够的空闲内存区. 2.这段内存区的前256字节中,创建一个称为程序段前缀(PSP)的数据区. 3.这段内存区256字节之后,将程序装入,程序的地址被设为SA+10H : 0 ...

  3. 明解STM32—GPIO应用设计篇之IO外部中断EXTI原理及使用方法

    ​一.前言 在之前针对STM32的GPIO相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读信号引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取检测操作,除了轮询的 ...

  4. Vulhub靶场的搭建

    Vulhub靶场的搭建(基于centos7) 1>简述 很多人在搭建Vulhub靶场的时候,可能也搜到过许多的文章,但是大多数的文章只是有一个流程,对其中的原理,步骤没有进行详细的说明,这也就导 ...

  5. 深入浅出MySQL - 架构与执行

    Photo by Merilin Kirsika Tedder from Pexels 一.MySQL的逻辑架构 MySQL作为一个流行的开源关系型数据库管理系统,它可以运行在多种平台上,支持多种存储 ...

  6. 在命令行按下tab键之后, 发生了生么?

    1. 引言 2. complete命令 3. 自定义补全列表 4. 动态补全列表 5. compgen命令 6. 别名的自动补全 7. 补全规则永久生效 8. 自动加载 9. 参考 1. 引言 当我们 ...

  7. 驱动开发:内核远程线程实现DLL注入

    在笔者上一篇文章<内核RIP劫持实现DLL注入>介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过NtCreateThreadEx这个内核函数实 ...

  8. linux grep基本用法--九五小庞

    通过此语句可以查询一个文件或者当前目录下所有文件中包含exception和error的文件 grep -E -i "((exception)|(error))" * 1.查找文件中 ...

  9. Github的一个彩蛋

    点击新建仓库 项目名称为自己的昵称 下方提示意思说: 你发现了一个秘密 这是一个特别的仓库 你可以为你的首页增加README.md 就像给项目介绍一样,这是你的自我介绍 点击编辑,里面会与建议模板 以 ...

  10. 深入JS——理解闭包可以看作是某种意义上的重生

    JS中有一个非常重要但又难以完全掌握的概念,那就是闭包.很多JS程序员自以为已经掌握了闭包,但实质上是一知半解,就像"JS中万物皆为对象"这个常见的错误说法一样,很多前端开发者到现 ...