一、WebApiThrottle限流框架

1、Nuget安装(PM)

PM> Install-Package WebApiThrottle

WebApiThrottle支持自定义配置各种限流策略。可以根据不同场景配置多个不同的限制,比如授权某个IP每秒、每分钟、每小时、每天、每周的最大调用次数。 这些限制策略可以配置在所有请求上,也可以单独给每个API接口去配置。

2、WebApiConfig 增加

            //WebApiConfig 增加config.MessageHandlers.Add(new ThrottlingHandler(){Policy = new ThrottlePolicy(perSecond: 1            //可选参数 每秒限制次数, perMinute: 20         //可选参数 每分钟限制次数, perHour: 200          //可选参数 每小时限制次数, perDay: 1500          //可选参数 每天限制次数, perWeek: 3000         //可选参数 每周限制次数
                    ){IpThrottling = true,   //该值指示是否启用IP限制ClientThrottling = true //该值指示是否启用客户端限制
                },Repository = new CacheRepository(),//QuotaExceededMessage = JsonConvert.SerializeObject(json.msg),QuotaExceededContent = (l, obj) =>  //违反限流事件
                {//var json = new JsonResult { code = 0, msg = $"超出规定的频率了,{l}{obj}" };var json=new  { code = 0, msg = $"超出规定的频率了,{l}{obj}" };//匿名Jsonreturn (json);}});

然后在新建的控制内添加请求的Action==http://localhost:60288/api/temp

        public IEnumerable<string> Get(){yield return DateTime.Now.ToString();}

默认情况下,被拒绝的请求不会累加到WebApiThrottle的计数器里。 比如一个客户端在同一秒中请求了3次,而你配置的限制策略是每秒1次,那么分钟、小时、天的计数器只会记录第一次调用,因为第一次请求不会被拒绝。如果你想把被拒绝的请求也计算到其他的计数器里(分钟、小时、天),你可以设置StackBlockedRequests为true。

config.MessageHandlers.Add(new ThrottlingHandler()
{Policy = new ThrottlePolicy(perSecond: 1, perMinute: 30){IpThrottling = true,ClientThrottling = true,EndpointThrottling = true,StackBlockedRequests = true //拒绝的请求累加到WebApiThrottle的计数器里        },Repository = new CacheRepository()
});

有的时候我们只需要设置一个参数,每分钟限流次数

            //WebApiConfig 增加config.MessageHandlers.Add(new ThrottlingHandler(){Policy = new ThrottlePolicy( perMinute: 5 )//可选参数 我们仅需要每分钟限制次数
                {IpThrottling = true   //该值指示是否启用IP限制,ClientThrottling = true //该值指示是否启用客户端限制
                },Repository = new CacheRepository(),//QuotaExceededMessage = JsonConvert.SerializeObject(json.msg),QuotaExceededContent = (l, obj) =>  //违反限流事件
                {//var json = new JsonResult { code = 0, msg = $"超出规定的频率了,{l}{obj}" };var json = new { code = 0, msg = $"超出规定的频率了,{l}{obj}" };//匿名Jsonreturn (json);}});

3、使用方式一(EnableThrottlingAttribute特性配置限制频率-围绕controllers和actions去自定义频率限制)

EnableThrottling与ThrottlingHandler是一个二选一的策略配置方案,二者会做同样的事情,但ThrottlingHandler可以通过EnableThrottlingAttribute特性指定某个webapi的controllers和actions去自定义频率限制。需要注意的是,在webapi请求管道中,ThrottlingHandler是在controller前面执行,因此在你不需要ThrottlingFilter提供的功能时,可以用ThrottlingHandler去直接替代它。

设置ThrottlingFilter过滤器的步骤,跟ThrottlingHandler类似:

config.Filters.Add(new ThrottlingFilter()
{Policy = new ThrottlePolicy(perSecond: 1, perMinute: 20, perHour: 200, perDay: 2000, perWeek: 10000){//ip配置区域IpThrottling = true,IpRules = new Dictionary<string, RateLimits>{ { "::1/10", new RateLimits { PerSecond = 2 } },{ "192.168.2.1", new RateLimits { PerMinute = 30, PerHour = 30*60, PerDay = 30*60*24 } }},//添加127.0.0.1到白名单,本地地址不启用限流策略IpWhitelist = new List<string> { "127.0.0.1", "192.168.0.0/24" },//客户端配置区域,如果ip限制也是启动的,那么客户端限制策略会与ip限制策略组合使用。ClientRules = new Dictionary<string, RateLimits>{ { "api-client-key-demo", new RateLimits { PerDay = 5000 } }},//白名单中的客户端key不会进行限流。ClientWhitelist = new List<string> { "admin-key" },//端点限制策略配置会从EnableThrottling特性中获取。EndpointThrottling = true}
});

使用特性开启限流并配置限制频率:

[EnableThrottling(PerSecond = 2)]
public class ValuesController : ApiController
{[EnableThrottling(PerSecond = 1, PerMinute = 30, PerHour = 100)]public IEnumerable<string> Get(){return new string[] { "value1", "value2" };}[DisableThrotting]public string Get(int id){return "value";}
}

4、使用方式二(端点自定义限制频率-围绕路由地址去限制频率)

你也可以为明确的路由地址去自定义限制频率,这些限制配置会重写WebApiThrottle的默认配置。也可以通过相关联的路由地址去定义端点的限制规则,比如api/entry/1端点的请求仅仅是/entry/整个路由地址请求的一部分。 配置后,端点限制引擎会在请求的绝对URI中去搜索这个表达式(api/entry/1),如果这个表达式在请求路由策略中被找到,那么这个限制规则将会被应用。如果有两个或更多的限制规则匹配到同一个URL,更近一级的限制策略将会被应用。

config.MessageHandlers.Add(new ThrottlingHandler()
{Policy = new ThrottlePolicy(perSecond: 1, perMinute: 20, perHour: 200){IpThrottling = true,ClientThrottling = true,EndpointThrottling = true,EndpointRules = new Dictionary<string, RateLimits>{ { "api/search", new RateLimits { PerSecond = 10, PerMinute = 100, PerHour = 1000 } }}},Repository = new CacheRepository()
});

转载于:https://www.cnblogs.com/fger/p/11119566.html

WebApiThrottle限流框架相关推荐

  1. 项目分享-限流框架的实现

    背景 开篇之前我一直在想怎么把这个项目给讲清楚,如果在互联网公司有高并发场景对于这个内容的就比较容易接受.这里大概说一下背景:代码写于2013年四月份,最开始的雏形是在2012年写的,从另外一个项目上 ...

  2. 【Dnc.Api.Throttle】适用于.Net Core WebApi接口限流框架

    Dnc.Api.Throttle    适用于Dot Net Core的WebApi接口限流框架 使用Dnc.Api.Throttle可以使您轻松实现WebApi接口的限流管理.Dnc.Api.Thr ...

  3. 介绍一个基于Spring Redis Lua的无侵入应用级网关限流框架

    介绍一个基于Spring Redis Lua的无侵入应用级网关限流框架 项目介绍 为什么选择spring-redis-current-limit Quick Start 1. 引入spring-red ...

  4. 【限流02】限流算法实战篇 - 手撸一个单机版Http接口通用限流框架

    本文将从需求的背景.需求分析.框架设计.框架实现几个层面一步一步去实现一个单机版的Http接口通用限流框架. 一.限流框架分析 1.需求背景 微服务系统中,我们开发的接口可能会提供给很多不同的系统去调 ...

  5. 阿里开源分布式限流框架 -Sentinel Go 0.3.0 发布,支持熔断降级能力

    作者 | 宿何  阿里巴巴高级开发工程师 Sentinel 是阿里巴巴开源的,面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统自适应保护等多个维度来帮助开发者保障 ...

  6. java服务端限流框架,美团大众点评服务框架Pigeon

    服务框架Pigeon架构 ? Pigeon提供jar包接入 ,线上运行在tomcat里 ? Monitor-CAT ,负责调用链路分析.异常监控告警等 ? 配置中心-Lion ,负责一些开关配置读取 ...

  7. spring boot框架_redislimiter-spring-boot分布式限流框架

    1. 修改项目resources/application.yml文件 server: port: 8888 #端口spring: application: name: demo1 #应用名称必须要配置 ...

  8. 常用的限流框架,你都会用吗?

     作者:fredal fredal.xin/netflix-concuurency-limits 作为应对高并发的手段之一,限流并不是一个新鲜的话题了.从Guava的Ratelimiter到Hystr ...

  9. 控制ASP.NET Web API 调用频率与限流

    ASP.NET MVC 实现 https://github.com/stefanprodan/MvcThrottle ASP.NET WEBAPI 实现 https://github.com/stef ...

最新文章

  1. mysql平均锁_MySQL锁情况分析
  2. Scala开发入门教程
  3. PHP算法基于相同键合并数组
  4. load和initialize
  5. Git之怎么通过命令修改前面几次提交的记录
  6. jvm能识别什么字符集_识别JVM –比预期要难
  7. mysql正则表达式匹配非_MySQL的正则表达式
  8. c语言枪图形,6个变态的C语言Hello World程序[转载]
  9. 深入理解JAVA锁的机制
  10. 我的世界javamod怎么装_耐斯地板 | 木地板的铺装方向,你还不知道?
  11. 《概率统计》知识点(持续更新……)
  12. python工时计算_敏捷开发项目人力工时评估法则
  13. 服务器 启动多个nginx_Nginx工作原理和优化总结
  14. 【DockerCE】Docker-CE 20.10.17正式版发布
  15. ORacle异常:ORA-00980:同义词转换不再有效
  16. Vue项目启动时自动打开浏览器
  17. (231)Verilog HDL:减法器
  18. 德尔玛递交注册:半年营收15亿 小米与欧派是股东
  19. python版本换行问题
  20. mc服务器怎么传送到我位置,我的世界联机怎么传送到队友身边_我的世界联机怎么传送到队友位置哪里身边手机版_攻略...

热门文章

  1. 调取方法_最新微信调取转账证据新方法公布
  2. linux 添加定时器,linux 添加定时任务
  3. vscode web版搭建_VS Code 1.39 发布!Web 版 VS Code 是否离我们越来越近了?(文末彩蛋)...
  4. java mysql教程基于_基于JAVA和MYSQL数据库实现的学生信息管理系统
  5. JavaScript内置对象→对象、系统函数、Date日期对象、String字符串对象、Math对象、Number数字对象、Object对象、Boolean对象、Error对象
  6. JAVA→JDBCJava DataBase Connectivity、存储过程Stored Procedure、事务Transaction、连接池DBCP C3P0、JDBC升级替代框架
  7. html调用mysql数据库表里值,如何从MYSQL数据库正确调用行到HTML表中
  8. android 访问本地image url_微信图片无法通过 WXSS 获取,可使用网络图片或 base64或image...
  9. JavaScript流程分支结构(1)
  10. Python入门-traceback