.NET Core WebApi接口ip限流实践

.NET Core WebApi接口ip限流实践

前言

之前一直想实现接口限流,但一直没去实现,然后刚好看到一篇文章是基于AspNetCoreRateLimit 组件的限流策略。这个组件不做多的介绍,想了解详情可以去访问官方网址或者原文地址,地址在文章底部,本文只讲实现。

实现接口限流步骤

导包

image

第一步 配置服务

由于需要再appsettings.json中去读取数据,所以需要在Program.cs配置文件中配置服务

builder.Services.AddOptions();

第二步 写一个扩展方法注册RateLimit相关服务

using StackExchange.Redis;
using AspNetCoreRateLimit;
using AspNetCoreRateLimit.Redis;

namespace AspNetCoreRate
{
    public static class ConfigureRateLimit
    {
        public static void AddRateLimit(this IServiceCollection services,IConfiguration conf)
        {
            services.Configure<IpRateLimitOptions>(conf.GetSection("IpRateLimiting"));

            // 注册 Redis 缓存服务
            services.AddStackExchangeRedisCache(options =>
            {
                options.Configuration = conf.GetConnectionString("Redis");
            });
            // 注册 Redis 连接服务
            var redisOptions = ConfigurationOptions.Parse(conf.GetConnectionString("Redis"));
            redisOptions.Password = "密码";
            services.AddSingleton<IConnectionMultiplexer>(provider =>
            {
                return ConnectionMultiplexer.Connect(redisOptions);
            });
            services.AddRedisRateLimiting();

            services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
        }
        public static IApplicationBuilder UseRateLimit(this IApplicationBuilder app)
        {
            app.UseIpRateLimiting();
            return app;
        }
    }
}

第三步 注册服务

//注册服务
builder.Services.AddRateLimit(builder.Configuration);
//将内存缓存服务注册到依赖注入容器中,可写可不写。
//builder.Services.AddDistributedMemoryCache();

builder.Services.AddDistributedMemoryCache();这个服务,看看chatGPT的回答

image

如果你不想使用内存缓存,也可以直接移除AddDistributedMemoryCache()服务的注册。在你的Startup.cs文件中,找到ConfigureServices方法,注释掉或者删除以下代码:

services.AddDistributedMemoryCache();

这样就可以移除内存缓存服务的注册了。不过,需要注意的是,如果你的Redis出现问题,应用程序将无法使用备用缓存,这可能会影响应用程序的性能和可用性。因此,建议你在使用Redis作为分布式缓存时,仍然注册AddDistributedMemoryCache()服务。😊

第四步 添加中间件

//添加中间件
app.UseStaticFiles(new StaticFileOptions
{
    ServeUnknownFileTypes = true
});
app.UseRateLimit();

记住把 UseRateLimit 放在 UseStaticFiles 后面,不然页面里的静态文件都被算进去访问次数,很快就被限流了。

第五步 在appsettings.json配置你的限流规则

  • EnableEndpointRateLimiting - 这个选项要设置为 true ,不然设置的限流是全局的,不能根据某个路径单独设置限流
  • StackBlockedRequests - 按照默认的设置为 false 就行,设置成 true 的话,一个接口被限流之后再重复请求还会计算到访问次数里面,这样有可能导致限流到天荒地老。
"IpRateLimiting": {
    "EnableEndpointRateLimiting": true,
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "IpWhitelist": [],
    "GeneralRules": [
      {
      //被限流的接口访问地址,可设置多个
        "Endpoint": "get:/api/GetUser",
        //1分钟
        "Period": "1m",
        //限制次数 5次
        "Limit": 5
      }
    ],
    "QuotaExceededResponse": {
      "Content": "{{ \"message\": \"先别急,你访问得太快了!\", \"details\": \"已经触发限流。限流规则: 每 {1} 只能访问 {0} 次。请 {2} 秒后再重试。\" }}",
      "ContentType": "application/json",
      "StatusCode": 429
    }
  },
  "ConnectionStrings": {
    "Redis": "redis服务器地址和端口号"
  },
  • {0} - 规则。限制
  • {1} - 规则。时期
  • {2} - 重试后

实现效果

image

测试接口地址

演示效果接口地址

参考资料

posted @   妙妙屋(zy)  阅读(1912)  评论(7编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
  1. 1 够爱(翻自 曾沛慈) 是我呀卡司宝贝
  2. 2 老人と海 ヨルシカ
  3. 3 生生世世爱 黄霄雲
  4. 4 希望有羽毛和翅膀 imzat
够爱(翻自 曾沛慈) - 是我呀卡司宝贝
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 无

作曲 : 无

翻唱:卡司

后期:A 酱

母带:TORA

海报:相如赋

“因为够爱,所以才勇敢啊”

我穿梭金星 木星 水星 火星 土星 追寻

追寻你 时间滴滴答滴答答的声音

我穿梭金星 木星 水星 火星 土星 追寻

追寻你 时间滴滴答滴答答的声音

指头还残留 你为我

擦的指甲油 没想透

你好像说过 你和我

会不会有以后

世界一直一直变

地球不停的转动

在你的时空 我从未退缩懦弱

当我靠在你耳朵

只想轻轻对你说

我的温柔 只想让你都拥有

我的爱 只能够

让你一个人 独自拥有

我的灵和魂魄

不停守候 在你心门口

我的伤和眼泪

化为乌有 为你而流

藏在 无边无际

小小宇宙 爱你的我

你听见了吗

我为你唱的这首歌

是为了要证明

我为了你 存在的意义

世界一直一直变

地球不停的转动

在你的时空 我从未退缩懦弱

当我靠在你耳朵

只想轻轻对你说我的温柔

只想让你都拥有

我的爱 只能够

让你一个 人独自拥有

我的灵和魂魄

不停守候 在你心门口

我的伤和眼泪化为乌有

为你而流

藏在 无边无际

小小宇宙 爱你的我

爱你的我 不能停止脉搏

为了爱你奋斗

就请你让我 说出口

爱 只能够

让你一个人 独自拥有

我的灵和魂魄

不停守候 在你心门口

我的伤和眼泪

化为乌有 为你而流

藏在 无边无际

小小宇宙 爱你的我

爱你的我 爱你的我

我穿梭金星 木星 水星

火星 土星 追寻

追寻你 时间滴滴答滴答

答滴声音

我穿梭金星 木星 水星

火星 土星 追寻

追寻你 时间滴滴答滴答

答的声音

我穿梭金星 木星 水星

火星 土星 追寻

追寻你 时间滴滴答滴答

答的声音

点击右上角即可分享
微信分享提示