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;打开…

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;你看到那个软盘接口了吗。。…

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

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

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

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

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

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

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熟…

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

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

python安装地是什么_如何安装python

展开全部 Python是跨平台的&#xff0c;可以运行在2113Windows、Mac和各种Linux/Unix系统上5261。在Windows上写Python程序&#xff0c;放到Linux上也是能够4102运行的。 要开始学习1653Python编程&#xff0c;首先就得把Python安装到电脑里。安装后&#xff0c;会得到Python解…

ABP vNext 实现租户Id自动赋值插入

背景在使用ABP vNext过程中&#xff0c;因为我们的用户体系庞大&#xff0c;所以一直与其他业务同时开发&#xff0c;在开发其他业务模块时&#xff0c;我们一直存在着误区&#xff1a;认为ABP vNext 自动处理了数据新增时的租户Id&#xff08;TenantId&#xff09;的自动赋值插…

深入研究.NET 5的开放式遥测

OpenTelemetry 介绍OpenTelemetry是一种开放的源代码规范&#xff0c;工具和SDK&#xff0c;用于检测&#xff0c;生成&#xff0c;收集和导出遥测数据&#xff08;指标&#xff0c;日志和跟踪&#xff09;,开放遥测技术得到了Cloud Native Computing Foundation&#xff08;CN…

.NET5实战千万并发,性能碾压各版本,云原生时代,.NET5为王!

在移动互联网时代掉队的.NET&#xff0c;当下正凭借着.NET5的开源跨平台以及容器友好&#xff0c;在云原生时代正在重铸辉煌。而作为.NET开发者&#xff0c;新年跳槽季的高并发问题会更多了&#xff0c;因为高并发能牵扯出太多问题&#xff0c;接口响应超时、CPU负载升高、GC频…

html点击按钮计算两个输入框的和_小程序计算报价功能介绍

一、使用场景用户可在管理后台设置计算值和运算公式&#xff0c;访客输入对应计算值&#xff0c;即可实现自动计算出结果&#xff0c;并提供相关的咨询入口&#xff0c;适用于装修、建材、房贷、车险等行业的报价行为。二、功能版本限制小程序至尊版可开启和使用计算报价功能。…

用python画树_Python+Turtle动态绘制一棵树实例分享

本文实例主要是对turtle的使用&#xff0c;实现Pythonturtle动态绘制一棵树的实例&#xff0c;具体代码&#xff1a; # drawtree.py from turtle import Turtle, mainloop def tree(plist, l, a, f): """ plist is list of pens l is length of branch a is hal…

[ASP.NET2.0] asp.net在ie7中使用FileUpload上传前预览图片 [ZT]

asp.net在ie7中使用FileUpload上传前预览图片 因为安全性问题&#xff0c;IE7禁用了image控件引用本地图片&#xff0c;为了这个问题郁闷了好几天&#xff0c;终于找到了解决方案&#xff0c;好东西要与大家分享&#xff0c;代码如下&#xff1a;此段代码放于<head> ....…

360浏览器5兼容模式吗_个独模式真能将企业总体税负降低至5%吗,为何大家都热衷核定征收...

个独模式真的能将企业总体税负降低至5%吗&#xff0c;为何大家都热衷选择申请核定征收企业性质不同&#xff0c;结构不同&#xff0c;体量不同&#xff0c;业务模式不同&#xff0c;自然纳税方式和税负也有差别。不同的纳税对象应该采取不同的节税方式&#xff0c;用合理合法的…

python3 for循环_从零开始学习PYTHON3讲义(六)for循环跟斐波那契数列

《从零开始PYTHON3》第六讲 几乎但凡接触过一点编程的人都知道for循环&#xff0c;在大多数语言的学习中&#xff0c;这也是第一个要学习的循环模式。 但是在Python中&#xff0c;我们把for循环放到了while循环的后面。原因是&#xff0c;Python中的for循环已经完全不是你知道的…

Yahoo Mail,慢功出细活〔转载〕

Yahoo Mail&#xff0c;慢功出细活2007年08月31日13:59 原文链接&#xff1a;http://chinese.wsj.com/gb/20070831/ptk141709.asp?sourcechannel用两年时间测试一款软件可真算费功夫&#xff0c;但雅虎公司(Yahoo! Inc.)开发完成新版本的电子邮箱软件Yahoo Mail就花了这么长…

浅谈如何理解领域驱动设计

本文作者为长沙.NET社区开发者微笑刺客&#xff0c;转载已获得作者授权。前言什么是领域&#xff0c;我习惯描述的是制药领域、环境领域、建筑领域、金融领域等&#xff0c;而在领域内&#xff0c;各种业务规则、业务知识盛行&#xff0c;如何有效的把控规则的变化&#xff0c;…