首页 > 其他分享 >.NET6之MiniAPI(二十一):限流

.NET6之MiniAPI(二十一):限流

时间:2022-11-28 20:58:57浏览次数:40  
标签:MiniAPI Endpoint builder Period 限流 Limit NET6 app

限流,可以网络的基础设施进行配置实现,也可以在网关的地方进行限流,但服务本身的限流也不可或缺,因为当多副本时,一个副本故障,流量对于其他副本来说会提高,如果超过其承受请求量的范围,会引起服务连续崩塌,所以单服务本身最好也是要实现限流的。

在asp.net core项目中,可以引入AspNetCoreRateLimit进行限流处理。

可以通过如下方式引入NuGet包

Install-Package AspNetCoreRateLimit

Client限流

using AspNetCoreRateLimit;

var builder = WebApplication.CreateBuilder(args);
// 注入内存缓存服务
builder.Services.AddMemoryCache();
//加载ClientRateLimiting配置文件
builder.Services.Configure<ClientRateLimitOptions>(builder.Configuration.GetSection("ClientRateLimiting"));
//加载ClientRateLimitPolicies配置文件
builder.Services.Configure<ClientRateLimitPolicies>(builder.Configuration.GetSection("ClientRateLimitPolicies"));

// 注入限流内存缓存服务
builder.Services.AddInMemoryRateLimiting();
// 注入限流配置文件服务
builder.Services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();

var app = builder.Build();

//启用ClientRateLimitPolicies
var clientPolicyStore = app.Services.GetRequiredService<IClientPolicyStore>();
await clientPolicyStore.SeedAsync();
//使用Client限流中间件
app.UseClientRateLimiting();

app.MapGet("/test00", () =>
{
    return "get test00 ok";
});

app.MapGet("/test01", () =>
{
    return "get test01 ok";
});
app.MapGet("/test02", () =>
{
    return "get test02 ok";
});
app.MapPost("/test02", () =>
{
    return "post test02 ok";
});

app.Run();

appsetings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ClientRateLimiting": {
    "EnableEndpointRateLimiting": false,
    "StackBlockedRequests": false,
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "EndpointWhitelist": [ "get:/test00", "*:/test01" ],
    "ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
    "GeneralRules": [
      {
        "Endpoint": "*",
        "Period": "5s",
        "Limit": 2
      },
      {
        "Endpoint": "*",
        "Period": "10s",
        "Limit": 3
      }      
    ]
  },
   "ClientRateLimitPolicies": {
    "ClientRules": [
      {
        "ClientId": "client-id-1",
        "Rules": [
          {
            "Endpoint": "*",
            "Period": "5s",
            "Limit": 1
          },
          {
            "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
          }
        ]
      }
    ]
  }
}

配置说明:

EnableEndpointRateLimiting为false全部请求总次数超过阈值,即限流,EnableEndpointRateLimiting为true时,各个请求单次超过阈值即限流StackBlockedRequests为false时,如果前5s请求了2个成功,1个失败,那第6s后还可以请求一个成功,如果这StackBlockedRequests为true时,那第6s的请求是不能成功的,也就是带不带拒绝的请求

 {
        "Endpoint": "*",
        "Period": "5s",
        "Limit": 2
      },
      {
        "Endpoint": "*",
        "Period": "10s",
        "Limit": 3
      },

ClientIdHeader指定可以通过Header键为X-ClientId处理限流黑白名单ClientWhitelist值为dev-id-1,dev-id-2,指Header里X-ClientId只要是其中的值 ,就放行EndpointWhitelist不参与限流的终节点HttpStatusCode限流后返回的状态码

GeneralRules通用限流规则

ClientRateLimitPolicies 配置是专门为了对不同的X-ClientId进行不同的限流配置,这样可以有区别的来分配流程,而不是一概而论,可以说是ClientId的灰名单,有限流的访问

 

不但可以通过ClientID限流,还可以是客户请示Ip来限流,配置雷同。

 

IP限流

using AspNetCoreRateLimit;

var builder = WebApplication.CreateBuilder(args);
// 注入内存缓存服务
builder.Services.AddMemoryCache();


//加载IPRateLimiting配置文件
builder.Services.Configure<IpRateLimitOptions>(builder.Configuration.GetSection("IpRateLimiting"));

//加载IPRateLimitPolicies配置文件
builder.Services.Configure<IpRateLimitPolicies>(builder.Configuration.GetSection("IpRateLimitPolicies"));

// 注入限流内存缓存服务
builder.Services.AddInMemoryRateLimiting();
// 注入限流配置文件服务
builder.Services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();

var app = builder.Build();
//启用IPRateLimitPolicies
var ipPolicyStore = app.Services.GetRequiredService<IIpPolicyStore>();
await ipPolicyStore.SeedAsync();
//使用Ip限流中间件
app.UseIpRateLimiting();

app.MapGet("/test00", () =>
{
    return "get test00 ok";
});

app.MapGet("/test01", () =>
{
    return "get test01 ok";
});

app.MapGet("/test02", () =>
{
    return "get test02 ok";
});
app.MapPost("/test02", () =>
{
    return "post test02 ok";
});
app.MapGet("/test03", () =>
{
    return "get test01 ok";
});
app.Run();

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "IpRateLimiting": {
    "EnableEndpointRateLimiting": false,
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "IpWhitelist": [ "127.0.0.1"],
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "EndpointWhitelist": [ "get:/test00", "*:/test01" ],
    "ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
    "GeneralRules": [
      {
        "Endpoint": "*",
        "Period": "5s",
        "Limit": 2
      },
      {
        "Endpoint": "*",
        "Period": "10s",
        "Limit": 3
      }     
    ]
  },
  "IpRateLimitPolicies": {
    "IpRules": [
      {
        "Ip": "127.0.0.2",
        "Rules": [
          {
            "Endpoint": "*",
            "Period": "4s",
            "Limit": 1
          },
          {
            "Endpoint": "*",
            "Period": "15m",
            "Limit": 200
          }
        ]
      }     
    ]
  }
}

 

  想要更快更方便的了解相关知识,可以关注微信公众号  

 

 

标签:MiniAPI,Endpoint,builder,Period,限流,Limit,NET6,app
From: https://www.cnblogs.com/ljknlb/p/16933558.html

相关文章

  • .NET6之MiniAPI(二十一):限流
    限流,可以网络的基础设施进行配置实现,也可以在网关的地方进行限流,但服务本身的限流也不可或缺,因为当多副本时,一个副本故障,流量对于其他副本来说会提高,如果超过其承受请求量......
  • .NET6之MiniAPI(十九):NLog
    在本系例文章的第八篇中,我们聊过官方的日志实现,即《.NET6之MiniAPI(八):日志》。但官方的日志功能更多是提供了一个实现基础,对于要求一个灵活,强大,方便的日志体系,官方的还是......
  • .NET6之MiniAPI(二十):实体验证FluentValidation
    为了验证apipost上来的数据的有效性,我们可以引入FluentValidation(详见https://fluentvalidation.net)。在asp.netmvc中,使用的是模型验证,通过在实体类上添加特性达到......
  • .NET6之MiniAPI(二十):实体验证FluentValidation
    为了验证apipost上来的数据的有效性,我们可以引入FluentValidation(详见https://fluentvalidation.net)。在asp.netmvc中,使用的是模型验证,通过在实体类上添加特性达到......
  • .NET6之MiniAPI(十九):NLog
    在本系例文章的第八篇中,我们聊过官方的日志实现,即《.NET6之MiniAPI(八):日志》。但官方的日志功能更多是提供了一个实现基础,对于要求一个灵活,强大,方便的日志体系,官方的还是有......
  • Net6 CodeFirst注入MySQL数据库上下文
    十年河东,十年河西,莫欺少年穷学无止境,精益求精 2022太难了,好多公司倒闭,互联网不景气,工作难找,苏州的C#/Net程序员的招聘更是少之又少,java,C,等其他语言也是供大于求,总之,难上......
  • .NET6之MiniAPI(十七):缓存
    缓存是空间换时间的一种做法,可以有效的提升响应时间,asp.netcore引入了本地内存缓存和分布式缓存。先看一下本地内存缓存:usingMicrosoft.Extensions.Caching.M......
  • .NET6之MiniAPI(十七):缓存
    缓存是空间换时间的一种做法,可以有效的提升响应时间,asp.netcore引入了本地内存缓存和分布式缓存。先看一下本地内存缓存:usingMicrosoft.Extensions.Caching.M......
  • .NET6之MiniAPI(十六):数据保护
    对于web,安全是一个永久的话题,所以ASP.NETCore数据保护提供了一个简单,易用的加密API,可以用来保护数据,密钥管理和轮换。ASP.NETCore的数据保护是根据本机的一个ke......
  • .NET6之MiniAPI(十六):数据保护
    对于web,安全是一个永久的话题,所以ASP.NETCore数据保护提供了一个简单,易用的加密API,可以用来保护数据,密钥管理和轮换。ASP.NETCore的数据保护是根据本机的一个ke......