关于 Sentinel 限流功能,请点 这里 查看。
在应用的开发中,我们经常会遇到这样的一些场景,例如:
等等情况,这些业务都有一个明显的特征:并发量非常高。倘若没做好限流,往往会造成系统崩溃的情况。
在 Jboot 中,我们可以对某个url请求进行限流,也可以对某个java方法
进行限流。
Jboot 提供了两种方案:
使用方案1:通过配置来实现
在 jboot.properties
文件中定义如下:
jboot.limit.enable = true
jboot.limit.rule = /user*:tb:1,/other*:iptb:1,io.jboot.aop*.get*(*):tb:1
jboot.limit.ipWhitelist = 127.0.0.1
规则说明:
- 1、可以配置多个规则,每个规则用英文逗号隔开
- 2、规则分为三个部分,用冒号(:)隔开,分别是:资源、限流类型、限流参数值
- 3、限流的类型有4种、分别是:tb、cc、iptb 和 ipcc。tb:TOKEN BUCKET(令牌桶,每秒允许访问的数量),cc:CONCURRENCY(并发量),iptb:单个ip每秒允许访问的数量,ipcc:单个ip允许同时的并发量。
- 4、星号(*)匹配任意字符,也可以是空字符。
在以上配置中,配置了三个规则,分别是:
/user*:tb:1
/other*:iptb:1
io.jboot.aop*.get*(*):cc:1
第一个规则:匹配 /user
开头的所有url地址,每个 url 地址,1 秒钟之内只允许访问 1 次。
第二个规则:匹配 /other
开头的所有url地址,每个 ip 地址在 1 秒钟之内只允许访问 1 次。
第三个规则:匹配 io.jboot.aop
开头的所有包名,并且 get
开头的所有任意参数的方法。并发量为 1。
使用方案2:通过注解 @EnableLimit
例如:
@RequestMapping("/")
public class IndexController extends JbootController {
@EnableLimit(rate = 1,fallback = "fallbackMethod")
public void index() {
renderText("index...." );
}
public void fallbackMethod(){
renderText("fallback...");
}
}
通过使用 @EnableLimit(rate = 1,fallback = "fallbackMethod")
在方法 index()
方法配置后,当用户访问:http://127.0.0.1:8080
时,1秒钟内只有一次访问到 index()
方法,若有多次访问后,自动调用降级放方法 fallbackMethod()
执行。
@EnableLimit
支持的配置如下:
上文中提到,Jboot 提供了两种限流类型,他们分别是:
TOKEN BUCKET 令牌桶,是通过 Google Guava 的 RateLimiter 来实现的。
CONCURRENCY 并发量,是通过 Semaphore
实现的,具体代码实现请查看 LimiterInterceptor 。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。