【调整】移除第三方AspNetCoreRateLimit限流组件,使用.net8自带的RateLimiter特性。

This commit is contained in:
jianweie code
2023-11-17 13:36:08 +08:00
parent 4425c53413
commit 9efb2e11a6
11 changed files with 203 additions and 262 deletions

View File

@@ -1,5 +1,6 @@
using System;
using System.Linq;
using System.Threading.RateLimiting;
using Autofac;
using Autofac.Extensions.DependencyInjection;
using CoreCms.Net.Auth;
@@ -31,6 +32,9 @@ using Newtonsoft.Json;
using NLog.Web;
using Yitter.IdGenerator;
using LogLevel = NLog.LogLevel;
using Microsoft.AspNetCore.RateLimiting;
using CoreCms.Net.Model.ViewModels.Options;
using Microsoft.Extensions.Configuration;
var builder = WebApplication.CreateBuilder(args);
@@ -71,9 +75,6 @@ builder.Services.Configure<CoreCms.Net.WeChat.Service.Options.WeChatOptions>(bui
builder.Services.AddHttpClient();
builder.Services.AddSingleton<CoreCms.Net.WeChat.Service.HttpClients.IWeChatApiHttpClientFactory, CoreCms.Net.WeChat.Service.HttpClients.WeChatApiHttpClientFactory>();
//启用客户端IP限制速率
builder.Services.AddIpPolicyRateLimitSetup(builder.Configuration);
//Swagger接口文档注入
builder.Services.AddClientSwaggerSetup();
@@ -89,15 +90,6 @@ builder.Services.AddHttpContextSetup();
//服务配置中加入AutoFac控制器替换规则。
builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
//并发限制-使用队列策略模式
builder.Services.AddQueuePolicy(options =>
{
//最大并发请求数,超过之后,进行排队
options.MaxConcurrentRequests = AppSettingsConstVars.MiddlewareConcurrencyLimiterMaxConcurrentRequests;
//最大请求数,超过之后,返回503
options.RequestQueueLimit = AppSettingsConstVars.MiddlewareConcurrencyLimiterRequestQueueLimit;
});
//注册mvc注册razor引擎视图
builder.Services.AddMvc(options =>
{
@@ -122,6 +114,23 @@ builder.Services.AddMvc(options =>
p.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
});
//调用 AddRateLimiter 来将速率限制服务添加到服务集合
builder.Services.Configure<MyRateLimitOptions>(builder.Configuration.GetSection(MyRateLimitOptions.MyRateLimit));
var myOptions = new MyRateLimitOptions();
builder.Configuration.GetSection(MyRateLimitOptions.MyRateLimit).Bind(myOptions);
//取名方法限制
var concurrencyPolicy = "Concurrency";
builder.Services.AddRateLimiter(_ => _
.AddFixedWindowLimiter(policyName: concurrencyPolicy, options =>
{
options.PermitLimit = myOptions.PermitLimit;
//options.Window = TimeSpan.FromSeconds(myOptions.Window); //不走窗口限制了。直接走请求数限制。
options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
options.QueueLimit = myOptions.QueueLimit;
}));
// 雪花漂移算法
// 创建 IdGeneratorOptions 对象,请在构造函数中输入 WorkerId
var options = new IdGeneratorOptions(1);
@@ -173,10 +182,8 @@ app.UseForwardedHeaders(new ForwardedHeadersOptions
#region ===================================================================
// 获取用户访问真实ip
app.RealIpMiddleware();
// 启用并发限制中间件
app.UseConcurrencyLimiter();
// 开启Ip限流
app.UseIpLimitMiddle();
// 启用速率限制中间件
app.UseRateLimiter();
// 记录请求与返回数据 (注意开启权限,不然本地无法写入)
app.UseRequestResponseLog();
// 用户访问记录(必须放到外层,不然如果遇到异常,会报错,因为不能返回流)(注意开启权限,不然本地无法写入)