- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
近期项目中,提供了一些调用频率较高的api接口,需要保障服务器的稳定运行;需要对提供的接口进行限流控制。避免因客户端频繁的请求导致服务器的压力.
AspNetCoreRateLimit 是一个ASP.NET Core速率限制的解决方案,旨在控制客户端根据IP地址或客户端ID向Web API或MVC应用发出的请求的速率。AspNetCoreRateLimit包含一个 IpRateLimitMiddleware 和 ClientRateLimitMiddleware ,每个中间件可以根据不同的场景配置限制允许IP或客户端,自定义这些限制策略,也可以将限制策略应用在每个API URL或具体的HTTP Method上.
由上面介绍可知AspNetCoreRateLimit支持了两种方式:基于 客户端IP( IpRateLimitMiddleware) 和客户端ID( ClientRateLimitMiddleware )速率限制 接下来就分别说明使用方式 。
添加Nuget包引用:
1
|
Install-Package AspNetCoreRateLimit
|
1、修改Startup.cs中方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
public
class
Startup
{
public
Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public
IConfiguration Configuration {
get
; }
// This method gets called by the runtime. Use this method to add services to the container.
public
void
ConfigureServices(IServiceCollection services)
{
//需要从加载配置文件appsettings.json
services.AddOptions();
//需要存储速率限制计算器和ip规则
services.AddMemoryCache();
//从appsettings.json中加载常规配置,IpRateLimiting与配置文件中节点对应
services.Configure<IpRateLimitOptions>(Configuration.GetSection(
"IpRateLimiting"
));
//从appsettings.json中加载Ip规则
services.Configure<IpRateLimitPolicies>(Configuration.GetSection(
"IpRateLimitPolicies"
));
//注入计数器和规则存储
services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
services.AddControllers();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//配置(解析器、计数器密钥生成器)
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
//Other Code
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public
void
Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//Other Code
app.UseRouting();
app.UseAuthorization();
//启用客户端IP限制速率
app.UseIpRateLimiting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
|
2、在appsettings.json中添加通用配置项节点:(IpRateLimiting节点与Startup中取的节点对应) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
"IpRateLimiting"
: {
//false,则全局将应用限制,并且仅应用具有作为端点的规则*。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制
//true, 则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为*:/api/values客户端设置每秒5个呼叫的限制,
"EnableEndpointRateLimiting"
:
false
,
//false,拒绝的API调用不会添加到调用次数计数器上;如 客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等) //,则必须设置StackBlockedRequests为true。
"StackBlockedRequests"
:
false
,
//Kestrel 服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置
"RealIpHeader"
:
"X-Real-IP"
,
//取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。
"ClientIdHeader"
:
"X-ClientId"
,
//限制状态码
"HttpStatusCode"
: 429,
////IP白名单:支持Ip v4和v6
//"IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
////端点白名单
//"EndpointWhitelist": [ "get:/api/license", "*:/api/status" ],
////客户端白名单
//"ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
//通用规则
"GeneralRules"
: [
{
//端点路径
"Endpoint"
:
"*"
,
//时间段,格式:{数字}{单位};可使用单位:s, m, h, d
"Period"
:
"1s"
,
//限制
"Limit"
: 2
},
//15分钟只能调用100次
{
"Endpoint"
:
"*"
,
"Period"
:
"15m"
,
"Limit"
: 100},
//12H只能调用1000
{
"Endpoint"
:
"*"
,
"Period"
:
"12h"
,
"Limit"
: 1000},
//7天只能调用10000次
{
"Endpoint"
:
"*"
,
"Period"
:
"7d"
,
"Limit"
: 10000}
]
}
|
配置节点已添加相应注释信息.
规则设置格式:
端点格式: {HTTP_Verb}:{PATH} ,您可以使用asterix符号来定位任何HTTP谓词.
期间格式: {INT}{PERIOD_TYPE} ,您可以使用以下期间类型之一: s, m, h, d .
限制格式: {LONG} 。
3、特点Ip限制规则设置,在appsettings.json中添加 IP规则配置节点 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
"IpRateLimitPolicies"
: {
//ip规则
"IpRules"
: [
{
//IP
"Ip"
:
"84.247.85.224"
,
//规则内容
"Rules"
: [
//1s请求10次
{
"Endpoint"
:
"*"
,
"Period"
:
"1s"
,
"Limit"
: 10},
//15分钟请求200次
{
"Endpoint"
:
"*"
,
"Period"
:
"15m"
,
"Limit"
: 200}
]
},
{
//ip支持设置多个
"Ip"
:
"192.168.3.22/25"
,
"Rules"
: [
//1秒请求5次
{
"Endpoint"
:
"*"
,
"Period"
:
"1s"
,
"Limit"
: 5},
//15分钟请求150次
{
"Endpoint"
:
"*"
,
"Period"
:
"15m"
,
"Limit"
: 150},
//12小时请求500次
{
"Endpoint"
:
"*"
,
"Period"
:
"12h"
,
"Limit"
: 500}
]
}
]
}
|
1、修改Startup文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
public
void
ConfigureServices(IServiceCollection services)
{
//需要从加载配置文件appsettings.json
services.AddOptions();
//需要存储速率限制计算器和ip规则
services.AddMemoryCache();
//从appsettings.json中加载常规配置
services.Configure<ClientRateLimitOptions>(Configuration.GetSection(
"IPRateLimiting"
));
//从appsettings.json中加载客户端规则
services.Configure<ClientRateLimitPolicies>(Configuration.GetSection(
"ClientRateLimitPolicies"
));
//注入计数器和规则存储
services.AddSingleton<IClientPolicyStore, MemoryCacheClientPolicyStore>();
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
services.AddControllers();
// https://github.com/aspnet/Hosting/issues/793
// the IHttpContextAccessor service is not registered by default.
//注入计数器和规则存储
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//配置(解析器、计数器密钥生成器)
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
}
public
void
Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//启用客户端限制
app.UseClientRateLimiting();
app.UseMvc();
}
|
2、通用配置采用IP限制相同配置,添加客户端限制配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//客户端限制设置
"ClientRateLimitPolicies"
: {
"ClientRules"
: [
{
//客户端id
"ClientId"
:
"client-id-1"
,
"Rules"
: [
{
"Endpoint"
:
"*"
,
"Period"
:
"1s"
,
"Limit"
: 10},
{
"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}
]
}
]
}
|
3、调用结果:
设置规则:1s只能调用一次:首次调用 。
调用第二次:自定义返回内容 。
添加 IpRateLimitController控制器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
/// <summary>
/// IP限制控制器
/// </summary>
[Route(
"api/[controller]"
)]
[ApiController]
public
class
IpRateLimitController : ControllerBase
{
private
readonly
IpRateLimitOptions _options;
private
readonly
IIpPolicyStore _ipPolicyStore;
/// <summary>
///
/// </summary>
/// <param name="optionsAccessor"></param>
/// <param name="ipPolicyStore"></param>
public
IpRateLimitController(IOptions<IpRateLimitOptions> optionsAccessor, IIpPolicyStore ipPolicyStore)
{
_options = optionsAccessor.Value;
_ipPolicyStore = ipPolicyStore;
}
/// <summary>
/// 获取限制规则
/// </summary>
/// <returns></returns>
[HttpGet]
public
async Task<IpRateLimitPolicies> Get()
{
return
await _ipPolicyStore.GetAsync(_options.IpPolicyPrefix);
}
/// <summary>
///
/// </summary>
[HttpPost]
public
async Task Post(IpRateLimitPolicy ipRate)
{
var pol = await _ipPolicyStore.GetAsync(_options.IpPolicyPrefix);
if
(ipRate !=
null
)
{
pol.IpRules.Add(ipRate);
await _ipPolicyStore.SetAsync(_options.IpPolicyPrefix, pol);
}
}
}
|
分布式部署时,需要将速率限制计算器和ip规则存储到分布式缓存中如Redis 。
修改注入对象 。
1
2
3
|
// inject counter and rules distributed cache stores
services.AddSingleton<IClientPolicyStore, DistributedCacheClientPolicyStore>();
services.AddSingleton<IRateLimitCounterStore,DistributedCacheRateLimitCounterStore>();
|
添加Nuget包 Microsoft.Extensions.Caching.StackExchangeRedis 。
在Startup中设置Redis连接 。
1
2
3
4
5
6
7
8
9
10
|
services.AddStackExchangeRedisCache(options =>
{
options.ConfigurationOptions =
new
ConfigurationOptions
{
//silently retry in the background if the Redis connection is temporarily down
AbortOnConnectFail =
false
};
options.Configuration =
"localhost:6379"
;
options.InstanceName =
"AspNetRateLimit"
;
});
|
限制时自定义相应结果:
1
2
3
4
5
6
|
//请求返回
"QuotaExceededResponse"
: {
"Content"
:
"{{\"code\":429,\"msg\":\"Visit too frequently, please try again later\",\"data\":null}}"
,
"ContentType"
:
"application/json;utf-8"
,
"StatusCode"
: 429
},
|
调用时返回结果:
其他:
示例代码:https://github.com/cwsheng/WebAPIVersionDemo 。
到此这篇关于Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现的文章就介绍到这了,更多相关Asp.NET Core 限流控制内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/cwsheng/p/14458745.html 。
最后此篇关于Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现的文章就讲到这里了,如果你想了解更多关于Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
主要思想是将 EF Core nuget 包添加到 .NET Core 库项目,然后在一堆应用程序(例如 ASP.NET Core、Win 服务、控制台应用程序)中使用该库,而无需在每个应用程序中配置
我想要实现的是编写一个简单的.net核心后台工作程序(.net core 3.1)的代码,在该工作程序作为Windows服务运行时,我在其中将数据写入SQL Server数据库(通过EF Core 3
关于 .Net Core SDK download page 二进制文件有什么用?它与安装程序有何不同? 最佳答案 二进制文件是 .NET Core 的编译代码。它们拥有运行 .NET Core 所需
.NET Core 和 Entity Framework Core 之间的区别?我们可以在 .NET Core 中使用 Entity Framework Core 吗?两者都有什么优势? 最佳答案 E
.NET Core 和 ASP.NET Core 到底有什么区别? 它们是相互排斥的吗?我听说 ASP.NET Core 是基于 .NET Core 构建的,但它也可以基于完整的 .NET 框架构建。
我对 ASP.NET Core 开发完全陌生。我正在尝试使用单个模型和 mysql 创建一个简单的 asp.net core Web api 来存储模型数据,然后我想使用 Swagger 将其作为 R
.NET Core 和 Entity Framework Core 之间的区别?我们可以在 .NET Core 中使用 Entity Framework Core 吗?两者都有什么优势? 最佳答案 E
好吧,作为一个新的 .net 开发生态系统,我有点迷失在核心工具、版本等方面。 有人可以解释我之间的区别吗 VS 2015 核心工具预览版 x - See here .NET Core/SDK 与否
我已阅读有关如何通过信号器核心集线器从后台服务向客户端发送通知的文档。如何从客户端接收到后台服务的通知? 后台服务应该只是一个单例。 public class Startup { public
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
非常简单的问题: 我正在尝试创建一个像这样的谓词构建器: var predicate = PredicateBuilder.False(); 但似乎在Net Core和EF Core中不可用。
在 .NET Core 自包含应用程序 中...我们需要在 project.json 中指定运行时 (RID) 我们希望我们的应用程序针对...发布为什么会这样? .NET Core 是跨平台的,与我
如何用 iCloud Core Data 替换我现有的 Core Data?这是我的持久商店协调员: lazy var persistentStoreCoordinator: NSPersistent
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 2 年前。 Improv
今天我正在学习新的 ASP.net 核心 API 3.1,我想将我的旧网站从 MVC4 转移到 Web API。除了一件事,一切都很好。数据库连接。在我的旧网站中,我为每个客户端(10/15 数据库)
我在 Visual Studio 2015 Update 3 和 .NET Core 1.0 中工作。我有一个 .NETCoreApp v1.0 类型的 Web API 项目。当我添加一个 .NET
我一直在尝试遵循 Ben Cull ( http://benjii.me/2016/06/entity-framework-core-migrations-for-class-library-proj
当我打开我的 vs 代码程序时,我收到以下消息: 无法找到 .NET Core SDK。 .NET Core 调试将不会启用。确保 .NET Core SDK 已安装并且在路径上。 如果我安装甚至卸载
我偶然发现了一个非常奇怪的问题。每当 Web 应用程序启动时,dotnet.exe 都会使用相当多的内存(大约 300M)。然而,当它触及某些部分时(我感觉这与 EF Core 使用有关),它会在短时
ASP.NET Core Web (.NET Core) 与 ASP.NET Core Web (.NET Framework) 有什么区别? .NET Framework 是否提供 similar
我是一名优秀的程序员,十分优秀!