/// <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); } }
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); }
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); }
public RateLimit() { limit = LimitingFactory.Build(TimeSpan.FromSeconds(TimeInterval), LimitType, MaxQps, LimitSize); }