前言

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<IpRateLimitOptions>(App.Configuration.GetSection("IpRateLimit"));//services.AddSingleton<IProcessingStrategy, AsyncKeyLockProcessingStrategy>();//services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();//services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();//services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();//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中指定的值匹配,则不应用速率限制。

测试

限流中间件IpRateLimitMiddleware的使用相关推荐

  1. 源代码探案系列之 .NET Core 限流中间件 AspNetCoreRateLimit

    在 上一篇 文章中,博主带领大家一起深入了解 ConcurrencyLimiter 这个中间件,正当我得意洋洋地向 Catcher Wong 大佬吹嘘这一点小收获时,大佬一脸嫌弃地说,一个单机版的方案 ...

  2. Laravel 限流中间件 throttle 简析

    在Laravel 中配置 在 app\Http\Kernel.php 中,默认添加到中间件组 api 下,1分钟60次. 2. 限流原理 获取唯一请求来源,进行唯一标识(key) 获取该请求请求次数 ...

  3. 不得不了解系列之限流

    点击关注公众号,Java干货及时送达 来源:https://my.oschina.net/qiangmzsx/blog/4277685 限流简介 现在说到高可用系统,都会说到高可用的保护手段:缓存.降 ...

  4. 后端服务不得不了解之限流

    点击上方 好好学java ,选择 星标 公众号 重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客 ...

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

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

  6. 如何在 Asp.Net Core 中对请求进行限流

    译文链接:https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html 在应 ...

  7. 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

    上篇文章我介绍了如何在网关上增加自定义客户端授权功能,从设计到编码实现,一步一步详细讲解,相信大家也掌握了自定义中间件的开发技巧了,本篇我们将介绍如何实现自定义客户端的限流功能,来进一步完善网关的基础 ...

  8. 关于服务限流的一些思考

    限流的价值感 限流必然是很有价值的,在系统资源不足时面对外部世界的不确定性(突发流量,超预期的用户)而形成的一种自我保护机制. 但是价值感是很低的,因为99.99%的时候系统总是工作在安全线之下,甚至 ...

  9. 十分钟搞懂Java限流及常见方案

    点击关注公众号:互联网架构师,后台回复 2T获取2TB学习资源! 上一篇:Alibaba开源内网高并发编程手册.pdf 文章目录 限流基本概念 QPS和连接数控制 传输速率 黑白名单 分布式环境 限流 ...

最新文章

  1. pytorch实现手写数字识别_Paddle和Pytorch实现MNIST手写数字集识别对比
  2. 有这么一群人,他们通过AI撬动世界!
  3. TCP/IP——基本知识
  4. java 二分法 应用_介绍一下java中的二分法运用
  5. 树莓派:VNC远程控制
  6. AMIO编辑器开发(三):转向C++,月底遇到第二个瓶颈
  7. 【uoj#209】[UER #6]票数统计 组合数+乱搞
  8. 风险案例-24期-缺少严格的变更及版本控制流程,导致问题反复,调试工作量和时间增加...
  9. centos 5.6 x86 安装 文泉驿字体
  10. spark机器学习 源码解析及原理分析
  11. linux触摸屏校准命令,FL2440下触摸屏校准
  12. RT_thread 临界区保护
  13. Microsoft Remote Procedure Call Runtime 远程代码执行漏洞(CVE-2022-26809)
  14. Hutool Java 工具类库Excel导出,配置宽度自适应极度舒适
  15. 不小心删了(或覆盖了)window系统变量的PATH的怎么办?
  16. geoserver之gs-kml、gs-wcs、gs-rest、gs-gwc、gs-sec-jdbc
  17. 幽默笑话,隔壁的长舌妇,木子家原创
  18. 神经网络中前向传播和反向传播解析
  19. 判断手机为Android还是ios
  20. CSK6开发分享1-视觉开发套件初体验篇

热门文章

  1. 第六章 三大消息摘要算法总结
  2. WinRAR在DOS下压缩/解压缩的使用方法
  3. SQLServer、Mysql、Oracle 创建、删除用户和授予用户权限
  4. 【NOIP必备攻略】 基本noilinux使用方法
  5. 自己封装一个弹框插件
  6. [Javascript] Avoid Creating floats if they are not needed
  7. CSS/DIV网页设计视频教程目录【转】
  8. 大学生计算机课程考试试题,大学生计算机基础课程考试系统研究与实现
  9. linux 脚本 写更新,用Shell写的游戏客户端更新脚本
  10. java publickey_数字证书中读取PublicKey