asp.net core服务中的限流

使用了AspNetCoreRateLimit三方库,starup.cs配置如下。

using AspNetCoreRateLimit;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;namespace RateLimitDemo01
{public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }     public void ConfigureServices(IServiceCollection services){// needed to load configuration from appsettings.jsonservices.AddOptions();// needed to store rate limit counters and ip rulesservices.AddMemoryCache();//load general configuration from appsettings.jsonservices.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));//load ip rules from appsettings.jsonservices.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));// inject counter and rules storesservices.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();// the IHttpContextAccessor service is not registered by default.// the clientId/clientIp resolvers use it.services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();// configuration (resolvers, counter key builders)services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();services.AddControllers();services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new OpenApiInfo { Title = "RateLimitDemo01", Version = "v1" });});}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "RateLimitDemo01 v1"));}app.UseIpRateLimiting();app.UseHttpsRedirection();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}
}

客户端用了五组请求:None白名单 ,无限制,WhiteIP1限流1秒2次请求 ,WhiteIP2限流,因为每秒一次请求,所以分在一分钟五次的限流组中,ClientID001允许的客户ID,ClientID002不允许的客户端ID。

using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace RateLimitDemo01_Client
{class Program{static async Task Main(string[] args){Console.WriteLine("");Console.WriteLine("回车开始:");Console.ReadLine();var url = "https://localhost:5001";Console.WriteLine("---------None-------------");await None(url);Console.WriteLine("---------WhiteIP1-------------");await WhiteIP1(url);System.Threading.Thread.Sleep(2000);Console.WriteLine("---------WhiteIP2-------------");await WhiteIP2(url);Console.WriteLine("---------ClientID001-------------");await ClientID001(url);Console.WriteLine("---------ClientID002-------------");await ClientID002(url);Console.ReadLine();}static async Task None(string url){for (var i = 0; i < 5; i++){using (var client = new HttpClient()){client.BaseAddress = new Uri(url);//appsettings中配置,所以自由访问 "EndpointWhitelist": [ "get:/none", "*:/home/add" ],var request = new HttpRequestMessage(HttpMethod.Get, "/none");var response = await client.SendAsync(request);var content = await response.Content.ReadAsStringAsync();Console.WriteLine($"状态码:{response.StatusCode},{(int)response.StatusCode},返回值:" + content);}}}static async Task WhiteIP1(string url){for (var i = 0; i < 5; i++){using (var client = new HttpClient()){client.BaseAddress = new Uri(url);/*"GeneralRules": [{"Endpoint": "*","Period": "1s","Limit": 2}……*/var request = new HttpRequestMessage(HttpMethod.Get, "/whiteip1");var response = await client.SendAsync(request);var content = await response.Content.ReadAsStringAsync();Console.WriteLine($"状态码:{response.StatusCode},{(int)response.StatusCode},返回值:" + content);}}}static async Task WhiteIP2(string url){for (var i = 0; i < 5; i++){using (var client = new HttpClient()){client.BaseAddress = new Uri(url);/*"GeneralRules": [……{"Endpoint": "*","Period": "1m","Limit": 5}]*/System.Threading.Thread.Sleep(1000);var request = new HttpRequestMessage(HttpMethod.Get, "/whiteip2");var response = await client.SendAsync(request);var content = await response.Content.ReadAsStringAsync();Console.WriteLine($"状态码:{response.StatusCode},{(int)response.StatusCode},返回值:" + content);}}}static async Task ClientID001(string url){for (var i = 0; i < 5; i++){using (var client = new HttpClient()){client.BaseAddress = new Uri(url);var request = new HttpRequestMessage(HttpMethod.Get, "/clientid");request.Headers.Add("X-ClientId", "client_level_001");var response = await client.SendAsync(request);var content = await response.Content.ReadAsStringAsync();Console.WriteLine($"状态码:{response.StatusCode},{(int)response.StatusCode},返回值:" + content);}}}static async Task ClientID002(string url){for (var i = 0; i < 5; i++){using (var client = new HttpClient()){client.BaseAddress = new Uri(url);var request = new HttpRequestMessage(HttpMethod.Get, "/clientid");request.Headers.Add("X-ClientId", "client_level_002");var response = await client.SendAsync(request);var content = await response.Content.ReadAsStringAsync();Console.WriteLine($"状态码:{response.StatusCode},{(int)response.StatusCode},返回值:" + content);}}}}
}

web服务的appsettings.json配置如下:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","IpRateLimiting": {"EnableEndpointRateLimiting": false,"StackBlockedRequests": false,"RealIpHeader": "X-Real-IP","ClientIdHeader": "X-ClientId","HttpStatusCode": 429,"IpWhitelist": [ "127.0.0.1" ],"EndpointWhitelist": [ "get:/none", "*:/home/add" ],"ClientWhitelist": [ "client_level_001" ],"GeneralRules": [{"Endpoint": "*","Period": "1s","Limit": 2},{"Endpoint": "*","Period": "1m","Limit": 5}]},"IpRateLimitPolicies": {"IpRules": [{"Ip": "127.0.0.1","Rules": [{"Endpoint": "*","Period": "1s","Limit": 10},{"Endpoint": "*","Period": "15m","Limit": 200}]}]}
}

其中 EnableEndpointRateLimiting是全部请求累计还是每个API请求累计,StackBlockedRequests拒约的请求是否计入计数器中。

一场景

  "IpRateLimiting": {"EnableEndpointRateLimiting": false,"StackBlockedRequests": false,……

结果

None是不受限流限制的,因为在白名称内。WhiteIP1是因为一秒只能有两次请求,所以剩下的三次拒绝了,WhiteIP2是等待了两秒杀后再次一秒一次请求,所以请求了三次,第四次出错了,是因为一分钟只能有五次请求。ClientID001是允许的客户端,五次全过,ClientID002是不允许的客户端,五次全部拒绝。

二场景

  "IpRateLimiting": {"EnableEndpointRateLimiting": true,"StackBlockedRequests": false,……

当EnalbeEndopintRateLimiting为true时,第个url都是独立计算的,WhiteI2因为是新的请求,每秒一次,所以全部通过,ClientID002虽然ClientID不正确,但是一秒两次的限制生效了。

三场景

  "IpRateLimiting": {"EnableEndpointRateLimiting": false,"StackBlockedRequests": true,……

StackBlockedRequests为true,拒绝的请也会算在计数中,所以超过了每分钟五次的限制,WhiteIP2会被拒绝,如果把每次钟改成六次,可以看一下效果。

四场景

  "IpRateLimiting": {"EnableEndpointRateLimiting": true,"StackBlockedRequests": true,……

与场景二相同,每个api单独计数,失败的也算在内。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sublime text html乱码,Sublime Text 2中文显示乱码的解决方法

Sublime Text 2中文显示乱码的解决方法发布时间&#xff1a;2014-05-12 15:30:14 作者&#xff1a;佚名 我要评论这篇文章主要介绍了Sublime Text 2中文显示乱码的解决方法,需要的朋友可以参考下1、安装Sublime Package Control。在Sublime Text 2上用Ctrl&#xff5e;打开…

爱词霸英语学习社区还不错!

内容还比较丰富&#xff0c;去看看

2020 中国开源年度报告

点击上方“开源社”关注我们| 编辑&#xff1a;沈于蓝1前言撰写这篇前言&#xff0c;我们的心情一直很复杂&#xff0c;很难用某种词汇来概括。在心里升起的一句话是&#xff1a;“这是最好的时代&#xff0c;这是最坏的时代”。也许多年以后&#xff0c;我们回看 2020 年&…

python实验总结心得体会_Python,Pyvisa操作Agilent 86140x系列OSA

1&#xff0c;背景本人做光学的。。。最近研究实验偏向通信做WDM实验的时候发现能用实验室TCP/IP通信的光谱仪(OSA)都被用了&#xff0c;翻翻找找只在角落找到一台Agilent 68146B的OSA。。。就是下图这个货&#xff0c;想要捞取光谱数据&#xff0c;你看到那个软盘接口了吗。。…

计算机语言学考研科目,语言学考研笔记整理(共16页)

语言学考研笔记整理一、语言和语言学1&#xff0e;语言的本质(1)自然属性&#xff1a;语言从本质上来说是一套符号系统。(2)社会属性&#xff1a;是人类最重要的交际工具。(3)心理属性&#xff1a;是人类进行思维的工具。语言的自然属性从本质上来说是一套符号系统。2&#xff…

cisco路由器NAT配置

要想对Cisco路由器的NAT进行配置&#xff0c;别的不说&#xff0c;最起码的&#xff0c;你要知道什么是NAT吧。其实NAT就是网络地址转换,是用于将一个地址域&#xff08;如&#xff1a;专用Intranet&#xff09;映射到另一个地址域的标准方法。它有作用及原理&#xff0c;在这儿…

cgcs2000高斯平面直角坐标_如何巧妙记忆高斯积分

高斯积分作为一种特殊的反常积分&#xff0c;其应用范围相当广泛&#xff0c;无论是在概率论中所引入的高斯分布&#xff08;亦称正态分布&#xff09;&#xff0c;还是在统计物理中的相关应用&#xff0c;都表明其有着至关重要的作用。下面我们来介绍一种记忆高斯积分的方法&a…

ibm台式计算机不能自动关机,IBM X3650 M3 不定时自动关机求大神

单位一台IBM X3650 M3 开始是一条内存槽亮黄灯自动关机后 MEM灯亮&#xff0c;和同型号内存条互换后不报错&#xff0c;但是还是会自动关机&#xff0c;报BRD错误。 现在断电后能重新启动&#xff0c;但是过几个小时还是会自动关机。下面是IMM日志。求大神搭救。1 I 06/09/201…

基于.NET Core的优秀开源项目合集

开源项目非常适合入门&#xff0c;并且可以作为体系结构参考的好资源, GitHub中有几个开源的.NET Core项目&#xff0c;这些项目将帮助您使用不同类型的体系结构和编码模式来深入学习 .NET Core技术, 本文列出了不同类别的优秀的开源项目。???? eShopOnContainerseShopOnCo…

业务敏捷与SOA

Web2.0催生广泛的蝴蝶效应 亚洲蝴蝶拍拍翅膀&#xff0c;将使美洲几个月后出现比狂风还厉害的龙卷风&#xff01;”蝴蝶效应触发了六十年代对混沌理论的广泛关注&#xff0c;过去十几年&#xff0c;由圣菲研究所发起的复杂性理 论的研究也在对传统经济学发起挑战&#xff0c;有…

python判断字符串里的字符_python 判断检测字符串中是否包含指定字符或字符串(比如:?)...

in: 10px auto; padding: 0px; color: rgb(17, 17, 17); font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; white-space: normal; background-color: rgb(255, 255, 255);">成员操作符 in zimu "ABCDEFGHIJKLMNOPQRSTUVWXYZ"zi "…

如何在 .Net Core 中使用 IHostedService

在我们应用程序中常常会有一些执行后台任务和任务调度的需求&#xff0c;那如何在 ASP.Net Core 中实现呢&#xff1f;可以利用 Azure WebJobs 或者其他一些第三方任务调度框架&#xff0c;如&#xff1a;Quartz 和 Hangfire。在 ASP.Net Core 中&#xff0c;也可以将 后台任务…

提高计算机软件速度的方法,小白看过来!提高电脑速度8种实用方法

当电脑使用一段时间之后&#xff0c;常常会遇到运行速度逐渐变缓的情况&#xff0c;甚至卡顿死机&#xff0c;非常影响体验。那么有什么办法可以快速便捷的提高电脑运行速度呢?下面就教你8种办法&#xff0c;让电脑恢复飞速运行状态。1.关闭自动更新电脑总是自动更新&#xff…

网管笔记(1)8.22

8 月 22号,第一天实习,早上因为没有估算好时间所以迟到了点,从我住的地方到网吧,至少要半个小时,8点到,7点钟一定要准时起床.坚持也只有着几天的试用期.网吧出现的问题和解决的方法:一部分机器,在进入系统的时候,会出现读秒,从1到100,然后又跳下来,重新读.不知道原因, …

C# Task 循环任务_C# Task.Run调用外部参数

首先讲一下&#xff1a;c# Task启动带参数和返回值的方法&#xff1a;Task启动带参数Task.Run(() > test("123"));public void Test(string s){...todo..}Task启动带参数和返回值的方法var s Task.Run(() > isTest("ss"));var t s.Result;private …

如何向K8s,Docker-Compose注入镜像Tag

最近在做基于容器的CI/CD, 一个朴素的自动部署的思路是&#xff1a;从Git Repo打出git tag&#xff0c;作为镜像Tagssh远程登录到部署机器向部署环境注入镜像Tag&#xff0c;拉取镜像&#xff0c;重新部署下面分享我是如何在K8s、docker-compose中注入镜像Tag&#xff1f;k8s熟…

东北大学计算机 大一物理考试题,东北大学大学物理期末考题及答案Word版

《东北大学大学物理期末考题及答案Word版》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《东北大学大学物理期末考题及答案Word版(5页珍藏版)》请在人人文库网上搜索。1、传播优秀Word版文档 &#xff0c;希望对您有帮助&#xff0c;可双击去除&#xff01;东北大学物…

showModalDialog()、showModelessDialog()方法使用详解

一、showModalDialog和showModelessDialog有什么不同&#xff1f;   showModalDialog&#xff1a;被打开后就会始终保持输入焦点。除非对话框被关闭&#xff0c;否则用户无法切换到主窗口。类似alert的运行效果。   showModelessDialog&#xff1a;被打开后&#xff0c;用户…

.NET 项目中的单元测试

.NET 项目中的单元测试Intro“不会写单元测试的程序员不是合格的程序员&#xff0c;不写单元测试的程序员不是优秀的工程师。”—— 一只想要成为一个优秀程序员的渣逼程序猿。那么问题来了&#xff0c;什么是单元测试&#xff0c;如何做单元测试。单元测试单元测试的定义按照维…

职称计算机还用考试,职称计算机考试注意事项

职称计算机考试注意事项一、注意事项首先&#xff0c;由于考试是模块化设计&#xff0c;所以在报考时要选择自己熟悉的科目。切忌好高骛远&#xff0c;选择那些自己日常使用机会不多、并无把握的科目。许多人在考试时选择了自己工作中最常用的Windows XP、Word 2003、PowerPoin…