AspNetCoreRateLimit:限流的守门人

        在当今这个信息爆炸的时代,Web API的服务质量愈加受到开发者和企业的重视,其中之一就是如何合理地限制客户端的访问频率,以保证服务的稳定和公平。今天我们将深入探讨一个优秀的.Net Core速率限制组件——AspNetCoreRateLimit

        AspNetCoreRateLimit 是一个为ASP.NET Core设计的轻量级且高效的速率限制库。它的核心功能是帮助你控制客户端对Web APIMVC应用程序的请求频率,这种频率的控制可以基于IP地址或客户端ID进行。源代码完全开放,你可以在GitHub上找到

https://github.com/stefanprodan/AspNetCoreRateLimit

        并使用这个库,你可以轻松地为不同的需求场景设置多元化的限制规则。

如何安装

        首先,在NuGet包管理器中搜索AspNetCoreRateLimit并进行安装。NuGet是.Net平台的包管理器,它允许开发者分享和使用他人编写的代码。

eecd25c799bd8681dae34791751644e6.png

如何配置

        安装完成之后,下一步就是配置限流的规则。你需要打开appsettings.json配置文件,并添加相应的配置节点。以IpRateLimiting为例,主要的配置项如下:

"IpRateLimiting": {
  //true, 则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为*:/api/values客户端设置每秒5个呼叫的限制,
  //false,则全局将应用限制,并且仅应用具有作为端点的规则*。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制
  "EnableEndpointRateLimiting": true,
  //false,拒绝的API调用不会添加到调用次数计数器上;如 客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等)
  //,则必须设置StackBlockedRequests为true。
  "StackBlockedRequests": false,
  //Kestrel 服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置
  "RealIpHeader": "X-Real-IP",
  //取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。
  "ClientIdHeader": "X-ClientId",
   IP白名单:支持Ip v4和v6 
  "IpWhitelist": null,
  "EndpointWhitelist": null,
  "HttpStatusCode": 429,
  "QuotaExceededResponse": {
    "Content": "{{ \"message\": \"Too many requests,Please try again in {2} second(s).\", \"code\": 429,\"data \":\"\"}}",
    "ContentType": "application/json"
  },
  //规则
  "GeneralRules": [
    {
      "Endpoint": "*/api/FeeOpen/GetCropTransDetails",
      "Period": "1s",
      "Limit": 1
    }
  ]
}

        这里的"EnableEndpointRateLimiting"为true时,表示每个API接口都拥有独立的限流计数,如果为false则表示所有接口共享计数。其他配置选项则定义了当请求超限时返回的HTTP状态码和自定义响应内容。

依赖注入

        为了在ASP.NET Core项目中使用AspNetCoreRateLimit,我们需要在Startup.cs文件中的ConfigureServices方法中进行依赖注入:

services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();

        同时,在Configure方法中添加中间件:

app.UseIpRateLimiting();

配置接口限流规则

        在appsettings.json中的GeneralRules部分,你可以定义具体的接口限流规则。例如,你可以设置某个API接口在1秒内只允许访问1次:

"GeneralRules": [
  {
    "Endpoint": "*/api/Xzy/GetMyName",
    "Period": "1s",
    "Limit": 1
  }
]

        你也可以设置全局限流规则,对所有接口生效:

"GeneralRules": [
  {
    "Endpoint": "*",
    "Period": "1s",
    "Limit": 1
  }
]

        此外,支持根据不同的时间间隔设置不同的限流规则,例如:

"GeneralRules": [
  {
    "Endpoint": "*",
    "Period": "1s",
    "Limit": 2
  },
  {
    "Endpoint": "*",
    "Period": "15m",
    "Limit": 100
  },
  {
    "Endpoint": "*",
    "Period": "12h",
    "Limit": 1000
  },
  {
    "Endpoint": "*",
    "Period": "7d",
    "Limit": 10000
  }
]

        根据以上设置,当客户端请求的频率超过限制规则时,系统会返回429 Too Many Requests状态码。

afb2fc3a6ea70ad8f4d150a880e004f5.png

        当然,这个状态码和响应描述也是可以在QuotaExceededResponse中自定义的

        通过这样的方式,AspNetCoreRateLimit使得API的流量控制具备了高度的灵活性和可配置性。这不仅可以防止恶意用户滥用资源,还能够在用户高峰期间平滑流量,保障服务质量,从而为最终用户带来更加稳定和可靠的服务体验。

结语

        在API的开发和维护过程中,合理地设置请求限流策略对于保证系统稳定性和优化用户体验至关重要。AspNetCoreRateLimit作为一个成熟的中间件,提供了一套简便的配置和强大的功能,助力开发者和企业高效实现API的流量控制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值