WebApiThrottle限流框架
一、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限流框架相关推荐
- 项目分享-限流框架的实现
背景 开篇之前我一直在想怎么把这个项目给讲清楚,如果在互联网公司有高并发场景对于这个内容的就比较容易接受.这里大概说一下背景:代码写于2013年四月份,最开始的雏形是在2012年写的,从另外一个项目上 ...
- 【Dnc.Api.Throttle】适用于.Net Core WebApi接口限流框架
Dnc.Api.Throttle 适用于Dot Net Core的WebApi接口限流框架 使用Dnc.Api.Throttle可以使您轻松实现WebApi接口的限流管理.Dnc.Api.Thr ...
- 介绍一个基于Spring Redis Lua的无侵入应用级网关限流框架
介绍一个基于Spring Redis Lua的无侵入应用级网关限流框架 项目介绍 为什么选择spring-redis-current-limit Quick Start 1. 引入spring-red ...
- 【限流02】限流算法实战篇 - 手撸一个单机版Http接口通用限流框架
本文将从需求的背景.需求分析.框架设计.框架实现几个层面一步一步去实现一个单机版的Http接口通用限流框架. 一.限流框架分析 1.需求背景 微服务系统中,我们开发的接口可能会提供给很多不同的系统去调 ...
- 阿里开源分布式限流框架 -Sentinel Go 0.3.0 发布,支持熔断降级能力
作者 | 宿何 阿里巴巴高级开发工程师 Sentinel 是阿里巴巴开源的,面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统自适应保护等多个维度来帮助开发者保障 ...
- java服务端限流框架,美团大众点评服务框架Pigeon
服务框架Pigeon架构 ? Pigeon提供jar包接入 ,线上运行在tomcat里 ? Monitor-CAT ,负责调用链路分析.异常监控告警等 ? 配置中心-Lion ,负责一些开关配置读取 ...
- spring boot框架_redislimiter-spring-boot分布式限流框架
1. 修改项目resources/application.yml文件 server: port: 8888 #端口spring: application: name: demo1 #应用名称必须要配置 ...
- 常用的限流框架,你都会用吗?
作者:fredal fredal.xin/netflix-concuurency-limits 作为应对高并发的手段之一,限流并不是一个新鲜的话题了.从Guava的Ratelimiter到Hystr ...
- 控制ASP.NET Web API 调用频率与限流
ASP.NET MVC 实现 https://github.com/stefanprodan/MvcThrottle ASP.NET WEBAPI 实现 https://github.com/stef ...
最新文章
- mysql平均锁_MySQL锁情况分析
- Scala开发入门教程
- PHP算法基于相同键合并数组
- load和initialize
- Git之怎么通过命令修改前面几次提交的记录
- jvm能识别什么字符集_识别JVM –比预期要难
- mysql正则表达式匹配非_MySQL的正则表达式
- c语言枪图形,6个变态的C语言Hello World程序[转载]
- 深入理解JAVA锁的机制
- 我的世界javamod怎么装_耐斯地板 | 木地板的铺装方向,你还不知道?
- 《概率统计》知识点(持续更新……)
- python工时计算_敏捷开发项目人力工时评估法则
- 服务器 启动多个nginx_Nginx工作原理和优化总结
- 【DockerCE】Docker-CE 20.10.17正式版发布
- ORacle异常:ORA-00980:同义词转换不再有效
- Vue项目启动时自动打开浏览器
- (231)Verilog HDL:减法器
- 德尔玛递交注册:半年营收15亿 小米与欧派是股东
- python版本换行问题
- mc服务器怎么传送到我位置,我的世界联机怎么传送到队友身边_我的世界联机怎么传送到队友位置哪里身边手机版_攻略...
热门文章
- 调取方法_最新微信调取转账证据新方法公布
- linux 添加定时器,linux 添加定时任务
- vscode web版搭建_VS Code 1.39 发布!Web 版 VS Code 是否离我们越来越近了?(文末彩蛋)...
- java mysql教程基于_基于JAVA和MYSQL数据库实现的学生信息管理系统
- JavaScript内置对象→对象、系统函数、Date日期对象、String字符串对象、Math对象、Number数字对象、Object对象、Boolean对象、Error对象
- JAVA→JDBCJava DataBase Connectivity、存储过程Stored Procedure、事务Transaction、连接池DBCP C3P0、JDBC升级替代框架
- html调用mysql数据库表里值,如何从MYSQL数据库正确调用行到HTML表中
- android 访问本地image url_微信图片无法通过 WXSS 获取,可使用网络图片或 base64或image...
- JavaScript流程分支结构(1)
- Python入门-traceback