抖音粉丝群1
『7x24小时有问必答』

AI浪潮下的计算机行业——从业者现状与未来展望
前言
IpRateLimitMiddleware(Github: AspNetCoreRateLimit) 是ASPNETCore的一个限流的中间件,用于控制客户端调用API的频次, 如果客户端频繁访问服务器,可以限制它的频率,已降低访问服务器端的压力。或者如果有爬虫在爬取关键数据,也可以限制某个/某些API或者某些IP的每天调取次数, 这样限制他爬取的速度。
当然, 其实我要解决的是另外一个问题。我们写的WebApi有时候会存在一些API,我们只希望其它内部应用来调用,比如,WebApi的HealthCheck, 我们就希望只有我们的中台可以定时调用来获取信息, 而前端是不能调用。这个我们就可以把内部的IP地址放到IpWhitelist配置项中, 并且限制特定的API调用次数为0次, 这样只有白名单里面的地址可以访问对应的端点, 如下所示。
使用NuGet安装:
Install-Package AspNetCoreRateLimit
Startup  配置

 public Startup(IConfiguration configuration)

        {

            Configuration = configuration;

        }

        public IConfiguration Configuration { get; }

  public void ConfigureServices(IServiceCollection services)

        {

            //添加IP限流

            //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);

            //services.AddOptions();

            //services.AddMemoryCache();

            //services.Configure(App.Configuration.GetSection("IpRateLimit"));

            //services.AddSingleton();

            //services.AddSingleton();

            //services.AddSingleton();

            //services.AddSingleton();

            //services.AddHttpContextAccessor();

}

Configure 调用中间件
UseIpRateLimiting
  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

        {

            //启用限流

            //app.UseIpRateLimiting();

            }

appsettings.json
配置
  "IpRateLimit": {

    "EnableEndpointRateLimiting"true,

    "StackBlockedRequests"false,

    "RealIPHeader""X-Real-IP",

    "ClientIdHeader""X-ClientId",

    "HttpStatusCode"429,

    "GeneralRules": [

      {

        "Endpoint""*:/file/multipart/upload",

        "Period""1s",

        "Limit"20

      },

      {

        "Endpoint""*",

        "Period""1s",

        "Limit"2

      },

      {

        "Endpoint""*",

        "Period""15m",

        "Limit"300

      },

      {

        "Endpoint""*",

        "Period""12h",

        "Limit"3000

      },

      {

        "Endpoint""*",

        "Period""7d",

        "Limit"50000

      }

    ]

  }

配置说明
如果EnableEndpointRateLimiting设置为false则全局将应用限制,并且仅应用具有作为端点的规则*。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制。
如果EnableEndpointRateLimiting设置为true,则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为*:/api/values客户端设置每秒5个呼叫的限制,则可以GET /api/values每秒呼叫5次,但也可以呼叫5次PUT /api/values。
如果StackBlockedRequests设置为false,拒绝的API调用不会添加到调用次数计数器上。比如:如果客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等),则必须设置StackBlockedRequests为true。
在RealIpHeader使用时,你的Kestrel 服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置它。
将ClientIdHeader被用于提取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。
测试


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

Copyright 2010-2015. All rights reserved. 

微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码