结论:若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandler、fallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出。
将createOrder这个业务接口改造一下,同时指定blockHandler和fallback,代码如下:
此时不配置任何规则,直接访问接口,可以看到这里直接进入了异常降级处理,如下图:
我们对createOrder这个资源配置降级规则:60秒内如果出现2个以上的异常直接限流,如下图:
此时我们再次访问这个接口,可以看到前两次直接进入了fallback指定的方法中(并未达到限流的异常数阈值),两次之后就被限流了,进入了blockHandler方法中,效果如下图:
上述源码在sentinel-openfeign-provider9009这个模块中,源码获取方式见文末。
13、sentinel的黑白名单如何设置?顾名思义,黑名单就是拉黑呗,拉黑就是不能访问了呗,sentinel能够针对请求来源进行是否放行,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
sentinel控制台对应得规则配置如下图:
该规则对应得源码为com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule,几个属性如下:
resource:资源名,即限流规则的作用对象。
limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB。
strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式。
官方文档:https://github.com/alibaba/Sentinel/wiki/黑白名单控制
这里有个问题:请求来源是什么,怎么获取?
Sentinel提供了一个接口RequestOriginParser,我们可以实现这个接口根据自己业务的规则解析出请求来源名称。
下面我以IP作为区分请求来源,代码如下:
然后将127.0.0.1设置为黑名单,如下图:
直接访问::9009/sentinel/rate/order/query?id=1002,结果如下图:
可以看到被限流了哦.................
好了,黑白名单就介绍到这里。
上述源码在sentinel-openfeign-provider9009这个模块中,源码获取方式见文末。
14、限流规则如何持久化?