.net core如何进行限流?老鸟们都这么玩的!

第一步:我们可以安装一个工具包“Cx.NetCoreUtils”简化代码操作

第二步:我们先吧中间件的代码写出来,我们用到.net core的本地内存缓存 IMemoryCache 来实现记录客户的ip,

  public  class CurrentLimiting: ActionFilterAttribute
    {
        /// <summary>
        /// 每多少秒限流的请求上线
        /// </summary>
        public static int Count=60;
        /// <summary>
        /// 多少秒限流
        /// </summary>
        public static int Seconds=60;
        private readonly IMemoryCache memory;
        public CurrentLimiting(
            IMemoryCache memory
            )
        {
            this.memory = memory;
        }
        public  override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var targetInfo = $"{filterContext.HttpContext.Connection.RemoteIpAddress.MapToIPv4()}";//获取客户的ip地址然后进行缓存
            if (!memory.TryGetValue(targetInfo, out Data data)) {
                data = new Data
                {
                    Count = 1,
                    Time = DateTime.Now.AddSeconds(Seconds)//记录本次添加时间然后叠加配置的秒数
                };
                memory.Set(targetInfo, data, data.Time);
            }
            else {
                if (data.Count> Count) {
                    filterContext.Result = new ObjectResult(new ModelStateResult($"ip:{filterContext.HttpContext.Connection.RemoteIpAddress.MapToIPv4()},请求速度过快,超过每{Seconds}秒{Count}次限制,请稍后请求", 413));//这边是超过设置的请求数量进行返回
                }
                else {
                   data.Count++;
                    memory.Set(targetInfo, data, data.Time);//没有超过就继续添加过期时间继续使用第一次添加的
                }
            }
            base.OnActionExecuting(filterContext);
        }
        public class Data
        {
            public DateTime Time { get; set; }
            public int Count { get; set; }
        }
    }

第三步:中间件代码创建好然后在 Startup.cs配置文件配置 


services.AddMemoryCache(); 

services.AddControllers(o =>
            {
                o.Filters.Add(typeof(GlobalExceptionsFilter));
                o.Filters.Add(typeof(GlobalResponseFilter));
                o.Filters.Add<GlobalModelStateValidationFilter>();
                o.Filters.Add<CurrentLimiting>();
            }).AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
                options.SerializerSettings.DateFormatString = Constants.DefaultFullDateFormat;
            });

启动服务器然后对接口进行快速访问

 哈哈很简单吧,先就这样,技术交流请评论!谢谢观看!

猜你喜欢

转载自blog.csdn.net/xiaohucxy/article/details/119257186