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

在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}]}     ]}
}

.NET6之MiniAPI(二十一):限流相关推荐

  1. .NET6运行时动态更新限流阈值

    自FireflySoft.RateLimit发布以来,帮助了不少需要在.net中进行限流处理的用户.前段时间有个开发者发了一个pull request,大意是Redis重启的时候Lua script会 ...

  2. .NET6之MiniAPI(二十七):Metrics

    应用的各种Metrics是保证应用健康稳定运行的基础,特别对于一些可用性有所要求的应用,本文介绍prometheus-net这个三方指示库. prometheus-net的工作原理是,在应用内部埋点, ...

  3. .NET6之MiniAPI(二十九):UnitTest

    MiniAPI的单元测试与asp.net web api的单元测试大体是相同的(毕竟都是asp.net core),只是在小细节上有一些差异,文章中会说到这点. 本文测试框架是XUnit,Mock框架 ...

  4. .NET6之MiniAPI(二十五):Dapper

    注:如果你使用Dapper一段时间了,这篇你可以跳过去了. 在第十二篇中,我们聊过官方的ORM--EntityFramework,它可以把SQL细节都隐藏,这对于一些标准化的关系数据库项目非常便捷.今 ...

  5. .NET6之MiniAPI(二十四):用Polly重试

    为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断.重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止:熔断是为了防止太多的次数的无效访问,导致系统不可知异常. Poll ...

  6. .NET6之MiniAPI(二十三):Refit

    本篇是与上篇HttpClient有关联的,有前篇中,我们是直接使用HttpClient来发出请求的,所有的请求信息都是我们根据需要自己来填充的.那Refit是什么呢?它是一个让我们调用API就像调用一 ...

  7. .NET6之MiniAPI(二十二):HttpClient

    说明:本篇不是说明HttpClient怎么使用,而以分享在asp.net core mini api框架下,HttpClient的引入和使用方式. 我们在业务开发中,免不了调用三方的服务,这时就会用到 ...

  8. .NET6之MiniAPI(二十):实体验证FluentValidation

    为了验证api post上来的数据的有效性,我们可以引入FluentValidation(详见https://fluentvalidation.net).在asp.net mvc中,使用的是模型验证, ...

  9. .NET6之MiniAPI(三十):结束篇(附链接)

    不知不觉来到了<.NET6之MiniAPI>的第三十篇,回顾之前的篇幅,主要涉及如下: HTTP请求,应答 Request 桂素伟,公众号:桂迹.NET6之MiniAPI(二):reque ...

最新文章

  1. react hooks使用_如何使用React和Hooks检测外部点击
  2. 使用模板引擎Trimpath
  3. 成都Uber优步司机奖励政策(4月8日)
  4. Go gomaxprocs 调高引起调度性能损耗
  5. java web开发问题集合
  6. 单例模式双重校验锁_滴滴面试官:如何实现一个线程安全的单例模式
  7. java 代码块 作用_Java核心(三):代码块的作用
  8. [vue] 在使用计算属性的时,函数名和data数据源中的数据可以同名吗?
  9. Docker系列文章索引
  10. 【Flink】Flink ES6写入报错 IncompatibleClassChangeError: Implementing class
  11. 通用权限管理系统组件 (GPM - General Permissions Manager) 中灵活经典的.NET2.0数据库访问组件,附源码...
  12. 手机投屏不是全屏怎么办_手机投屏怎么满屏
  13. VMware Tanzu Application Service——Config Client (TAS)
  14. Raptor制作猜数游戏流程图
  15. Science:揭示人类大脑进化机制
  16. unity里移动鼠标控制物体的移动(2D)
  17. 孙溟㠭(展)为哥伦比亚总统‘阿尔瓦罗·乌里贝‘先生治名章篆刻印章
  18. JS中怎样使用Date对象加减日期
  19. 流媒体分析之rtmp协议srs服务器数据收发
  20. 基础2-用卷积神经网络进行颅内和头皮脑电图数据分析的广义癫痫预测

热门文章

  1. 任务管理器在右下角的图标不显示
  2. VS2005混合编译ARM汇编代码
  3. 使用MOM 2005监视DC的磁盘空间
  4. WPAD原理介绍暨故障排查:ISA2006系列之三
  5. 输出最大值MXNet实现
  6. Unity中Instantiate一个prefab时需要注意的问题
  7. 关于input type=file 限制文件上传类型
  8. msdn中C#中常用词汇概念(转帖)
  9. 开发Teams Tabs应用程序
  10. iphone解锁_有人可以用解锁的iPhone做的最糟糕的事情是什么?