Exemplo n.º 1
0
        /// <summary>
        /// 限流测试
        /// </summary>
        public void Handle()
        {
            var service = LimitingFactory.Build(TimeSpan.FromSeconds(1), LimitingType.TokenBucket, 20, 5);

            Console.Write("请输入线程数:");
            long.TryParse(Console.ReadLine(), out long th);
            for (int i = 0; i < th; i++)
            {
                var t = Task.Factory.StartNew(() =>
                {
                    while (true)
                    {
                        var result = service.Request();
                        //如果返回true,说明可以进行业务处理,否则需要继续等待
                        if (result)
                        {
                            Console.WriteLine($"{DateTime.Now}--{Task.CurrentId}---ok");
                            //业务处理......
                        }
                        else
                        {
                            Thread.Sleep(100);
                        }
                    }
                }, TaskCreationOptions.LongRunning);
            }
        }
Exemplo n.º 2
0
 public RateLimit(LimitingType limitType, int timeIntervalSeconds, int maxQps, int limitSize)
 {
     this.TimeInterval = timeIntervalSeconds;
     this.LimitType    = limitType;
     this.MaxQps       = maxQps;
     this.LimitSize    = limitSize;
     limit             = LimitingFactory.Build(TimeSpan.FromSeconds(TimeInterval), LimitType, MaxQps, LimitSize);
 }
Exemplo n.º 3
0
 public void Init(Models.Config config)
 {
     Config          = config;
     limitingService = LimitingFactory.Build(Config.limit.LimitingType, Config.limit.MaxTPS, Config.limit.MaxServiceQum, Config.limit.MaxFreq);
 }
        /// <summary>
        /// 返回True代表受限流控制
        /// </summary>
        /// <param name="httpContext"></param>
        /// <returns></returns>
        private bool RateLimit(HttpContext httpContext)
        {
            bool limit = false;

            if (vierConfig.Limit?.Enable == true)
            {
                var ip = httpContext.Connection.RemoteIpAddress.MapToIPv4();

                #region IpLimit

                if (vierConfig.Limit != null)
                {
                    if (IsBlackRateLimit(ip))//黑名单
                    {
                        return(true);
                    }
                    if (IsWhiteRateLimit(ip))//白名单不限流
                    {
                        return(false);
                    }
                    _rateLimitPool.TryGetValue(ip.ToString(), out LimitInfo limitInfo);
                    if (limitInfo == null)
                    {
                        //IP限流策略
                        Iplimit iplimit         = MatchIpLimit(ip);
                        var     limitingService = LimitingFactory.Build(TimeSpan.FromSeconds(iplimit.timeSpan)
                                                                        , LimitingType.LeakageBucket
                                                                        , (int)iplimit.rps
                                                                        , (int)iplimit.limitSize);
                        limitInfo = new LimitInfo()
                        {
                            Time            = DateTime.Now,
                            limitingService = limitingService
                        };
                        _rateLimitPool.TryAdd(ip.ToString(), limitInfo);
                    }
                    //ipLimit.Request() ==true 代表不受限制
                    limitInfo.Time = DateTime.Now;
                    limit          = (limitInfo.limitingService.Request() == false);
                    if (limit)
                    {
#if DEBUG
                        Console.WriteLine($"IP:{ip},Trigger current limiting.");
#endif
                        return(true);
                    }
                }
                #endregion
                #region TagLimit
                if (vierConfig.Limit.TagLimits != null)
                {
                    var taglimit = MatchTag(httpContext);
                    if (taglimit != null)
                    {
                        _rateLimitPool.TryGetValue($"{ taglimit.channel}.{ taglimit.router}", out LimitInfo limitInfo);
                        if (limitInfo == null)
                        {
                            var limitingService = LimitingFactory.Build(TimeSpan.FromSeconds(taglimit.timeSpan)
                                                                        , LimitingType.LeakageBucket
                                                                        , (int)taglimit.rps
                                                                        , (int)taglimit.limitSize);
                            limitInfo = new LimitInfo()
                            {
                                Time            = DateTime.Now,
                                limitingService = limitingService
                            };
                            _rateLimitPool.TryAdd($"{ taglimit.channel}.{ taglimit.router}", limitInfo);
                        }
                        //ipLimit.Request() ==true 代表不受限制
                        limitInfo.Time = DateTime.Now;
                        limit          = (limitInfo.limitingService.Request() == false);
                    }
                    if (limit)
                    {
#if DEBUG
                        Console.WriteLine($"Tag:{taglimit.channel}.{taglimit.router},Trigger current limiting.");
#endif
                        return(true);
                    }
                }
                #endregion
            }
            return(limit);
        }
Exemplo n.º 5
0
 public RateLimit()
 {
     limit = LimitingFactory.Build(TimeSpan.FromSeconds(TimeInterval), LimitType, MaxQps, LimitSize);
 }