前言

在构建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. 【.NET源码解读】Configuration组件及自动更新

    Configuration组件是.NET中一个核心的.非常重要的组件.它提供了一种方便的机制,用于从配置文件.环境变量.命令行参数等各种数据源中读取和配置应用程序,以满足不同环境下应用程序的需求. 在 ...

  2. 图解VirtualBox安装CentOS 7

    VirtualBox简介 VirtualBox是由德国InnoTek软件公司出品的虚拟机软件,现在则由甲骨文公司进行开发,是甲骨文公司xVM虚拟化平台技术的一部分. VirtualBox提供用户在32 ...

  3. zabbix 监控nginx

    nginx内置了一个status状态的功能,通过配置可以看到nginx的运行情况,status显示的内容包括当前连接数,处于活动状态的连接数,已经处理的请求数等等,可以利用这个功能编写zabbix监控 ...

  4. 花了一周时间,总算把mysql的加锁搞清楚了,再也不怕间隙锁和next-key了

    接触mysql都知道在mysql中有很多锁,共享锁(S).排他锁(X).间隙锁(gap).next-key,当然还有意向锁.表锁等.今天不讲别的,专门来看下innodb引擎下的锁是什么样子的. 现在有 ...

  5. 【对比】ChatGPT Plus与ChatGPT实操对比体验

    前言 缘由 20美刀大洋充值ChatGPT Plus,必须分享让它物尽其用 应单位追求科技前沿需求,以及花钱就是香的原则.遂找了远在他乡的高中老同学,斥资20美刀为公司身先士卒怒充会员.秉承分享至上原 ...

  6. 有哪些ASIC加速技术可以实现低功耗运行?

    目录 文章主题: 10. 有哪些ASIC加速技术可以实现低功耗运行? 背景介绍:随着移动设备.物联网.云计算等应用场景的不断增长,功耗成为了一个日益重要的技术问题.为了在移动设备上实现更长时间的运行, ...

  7. 驱动开发:摘除InlineHook内核钩子

    在笔者上一篇文章<驱动开发:内核层InlineHook挂钩函数>中介绍了通过替换函数头部代码的方式实现Hook挂钩,对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能 ...

  8. ElasticSearch - 批量更新bulk死锁问题排查

    一.问题系统介绍 监听商品变更MQ消息,查询商品最新的信息,调用BulkProcessor批量更新ES集群中的商品字段信息; 由于商品数据非常多,所以将商品数据存储到ES集群上,整个ES集群共划分了2 ...

  9. flutter小白是如何在一周内用chatGPT开发一款App的

    创作初衷 这篇文章创作的初衷,只是为了写一个有关日历类的软件供自己使用,考虑到自己从来还没有使用flutter正式创作一个app,因此磨刀霍霍想试一试. 至于为什么要做一款日历软件,因为发现市面上的关 ...

  10. Unity的IPostGenerateGradleAndroidProject:深入解析与实用案例

    Unity IPostGenerateGradleAndroidProject Unity是一款流行的跨平台游戏引擎,它支持多种平台,包括Android.在Unity中,我们可以使用IPostGene ...