AspNetCoreRateLimit 速率限制 接口访问限制 限流控制

限流是限制到达系统的并发请求数量,保证系统能够正常响应部分用户请求,而对于超过限制的流量,则通过拒绝服务的方式保证整体系统的可用性。
根据限流作用范围,可以分为单机限流和分布式限流;根据限流方式,又分为计数器、滑动窗口、漏桶和令牌桶限流,下面我们对这块详细进行讲解。

程序执行逻辑:
● 可以在程序中设置一个变量 count,当过来一个请求我就将这个数 +1,同时记录请求时间。
● 当下一个请求来的时候判断 count 的计数值是否超过设定的频次,以及当前请求的时间和第一次请求时间是否在 1 分钟内。
● 如果在 1 分钟内并且超过设定的频次则证明请求过多,后面的请求就拒绝掉。
● 如果该请求与第一个请求的间隔时间大于计数周期,且 count 值还在限流范围内,就重置 count。

AspNetCoreRateLimit 是一种 ASP.NET Core 速率限制解决方案,旨在控制客户端可以根据 IP 地址或客户端 ID 向 Web API 或 MVC 应用程序发出的请求速率。AspNetCoreRateLimit 包包含一个 IpRateLimitMiddleware 和一个 ClientRateLimitMiddleware,对于每个中间件,您可以为不同的场景设置多个限制,例如允许 IP 或客户端在每秒、15 分钟等时间间隔内进行最大调用次数。您可以定义这些限制来解决对 API 发出的所有请求,或者您可以将限制范围限定为每个 API URL 或 HTTP 动词和路径。

IpRateLimiting:限制普遍的ip
IpRateLimitPolicies:限制一些特殊的ip
ClientRateLimiting:客户端速率限制
ClientRateLimitPolicies:

EnableEndpointRateLimiting 设置为false,则限制将全局应用,并且仅应用具有端点*的规则。例如,如果您设置了每秒5次调用的限制,那么对任何端点的任何HTTP调用都将计入该限制。
EnableEndpointRateLimiting 设置为true,则限制将适用于{HTTP_Verb}{PATH}中的每个端点。例如,如果您为*:/api/values设置了每秒5次调用的限制,则客户端每秒可以调用GET/api/values 5次,但也可以调用PUT/api/vvalues 5次。

EnableEndpointRateLimiting:bool类型,
false 则全局将应用限制,并且仅应用具有作为端点的规则。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制;
true 则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为 *:/api/values客户端设置每秒5个呼叫的限制
StackBlockedRequests:bool类型,
true 如果希望被拒绝的API调用计入其他时间的显示(分钟,小时等)
false 拒绝的API调用不会添加到调用次数计数器上;如客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用
RealIpHeader:string类型,服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置
ClientIdHeader:string类型,取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。
HttpStatusCode:string类型,限制状态码
IpWhitelist:string类型,IP白名单:支持Ip v4和v6
EndpointWhitelist:string类型,端点白名单
ClientWhitelist:string类型,客户端白名单
GeneralRules:json类型,通用规则
QuotaExceededResponse:json类型,自定义返回的内容"QuotaExceededResponse": { "Content": "{{"code":429,"msg":"访问过于频繁,请稍后重试","data":null}}", "ContentType": "application/json", "StatusCode": 200}

Endpoint:string类型,端点路径;
Period:string类型,时间段,格式:{数字}{单位};可使用单位:s, m, h, d;
Limit:long类型,调用限制;

MemoryCacheIpPolicyStore
MemoryCacheClientPolicyStore
MemoryCacheRateLimitCounterStore
AsyncKeyLockProcessingStrategy

github 地址
https://github.com/stefanprodan/AspNetCoreRateLimit

功能
基于客户端 IP 的速率限制
设置和配置
定义速率限制规则
●行为
●运行时更新速率限制

基于客户端 ID 的速率限制
●设置和配置
●定义速率限制规则
●行为
●运行时更新速率限制

高级配置
●自定义配额超出响应
●IP / ClientId 解析贡献者
●使用 Redis 作为分布式计数器存储

管理 NuGet 程序包(N)...

AspNetCoreRateLimit
AspNetCoreRateLimit.Redis

1、Program.cs

#region 限流
// configure ip rate limiting middleware
builder.Services.Configure<IpRateLimitOptions>(builder.Configuration.GetSection("IpRateLimiting"));
builder.Services.Configure<IpRateLimitPolicies>(builder.Configuration.GetSection("IpRateLimitPolicies"));

// configure client rate limiting middleware
builder.Services.Configure<ClientRateLimitOptions>(builder.Configuration.GetSection("ClientRateLimiting"));
builder.Services.Configure<ClientRateLimitPolicies>(builder.Configuration.GetSection("ClientRateLimitPolicies"));

// register stores
builder.Services.AddInMemoryRateLimiting();

builder.Services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
builder.Services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();

//builder.Services.AddSingleton<IIpPolicyStore, DistributedCacheIpPolicyStore>();
//builder.Services.AddSingleton<IRateLimitCounterStore, DistributedCacheRateLimitCounterStore>();
#endregion

builder.Services.AddControllers();

#region 限流
// configure the resolvers
builder.Services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
#endregion


if (app.Environment.IsDevelopment())
{
}

//限流
app.UseIpRateLimiting();
app.UseClientRateLimiting();

*
*
2、appsettings.json

{
  "IpRateLimiting": {
    "EnableEndpointRateLimiting": false,
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "IpWhitelist": [
      "127.0.0.1",
      "::1/10",
      "192.168.0.0/24"
    ],
    "EndpointWhitelist": [
      "get:/api/license",
      "*:/api/status"
    ],
    "ClientWhitelist": [
      "dev-id-1",
      "dev-id-2"
    ],
    "GeneralRules": [
      { "Endpoint": "*", "Period": "1s", "Limit": 2 },
      { "Endpoint": "*", "Period": "15m", "Limit": 100 },
      { "Endpoint": "*", "Period": "12h", "Limit": 1000 },
      { "Endpoint": "*", "Period": "7d", "Limit": 10000 }
    ]
  },
  "IpRateLimitPolicies": {
    "IpRules": [
      {
        "Ip": "45.234.45.231",
        "Rules": [
          //1s请求10次
          { "Endpoint": "*", "Period": "1s", "Limit": 10 },
          //15分钟请求200次
          { "Endpoint": "*", "Period": "15m", "Limit": 200 }
        ]
      },
      {
        //ip支持设置多个
        "Ip": "192.168.1.21/25",
        "Rules": [
          //1秒请求5次
          { "Endpoint": "*", "Period": "1s", "Limit": 5 },
          //15分钟请求150次
          { "Endpoint": "*", "Period": "15m", "Limit": 150 },
          //12小时请求500次
          { "Endpoint": "*", "Period": "12h", "Limit": 500 }
        ]
      }
    ]
  },
  "ClientRateLimiting": {
    "EnableEndpointRateLimiting": false,
    "StackBlockedRequests": false,
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "EndpointWhitelist": [
      "get:/api/license",
      "*:/api/status"
    ],
    "ClientWhitelist": [
      "dev-id-1",
      "dev-id-2"
    ],
    "GeneralRules": [
      { "Endpoint": "*", "Period": "1s", "Limit": 2 },
      { "Endpoint": "*", "Period": "15m", "Limit": 100 },
      { "Endpoint": "*", "Period": "12h", "Limit": 1000 },
      { "Endpoint": "*", "Period": "7d", "Limit": 10000 }
    ]
  },
  "ClientRateLimitPolicies": {
    "ClientRules": [
      {
        "ClientId": "client-id-1",
        "Rules": [
          { "Endpoint": "*", "Period": "1s", "Limit": 10 },
          { "Endpoint": "*", "Period": "15m", "Limit": 200 }
        ]
      },
      {
        "ClientId": "client-id-2",
        "Rules": [
          { "Endpoint": "*", "Period": "1s", "Limit": 5 },
          { "Endpoint": "*", "Period": "15m", "Limit": 150 },
          { "Endpoint": "*", "Period": "12h", "Limit": 500 }
        ]
      }
    ]
  }
}

*
*
*

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值