在sentinel中所有可以监控的都属于资源,在默认的情况下所有的controller都是资源,资源名就是访问路径。
还有一种方式就是通过@SentinelResource指定资源,这样情况下通过value属性设置资源名。
注意下面这种在controller上面加的@SentinelResource指定的资源和默认的controller资源是属于两个资源,两者独立(各种设置的规则独立)。
官方文档
https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
这里先介绍一下阈值类型,存在两种阈值类型
这种模式是默认选择的默认,简单来说就是我们选择的资源触发了设定的阈值,就会开启服务降级或者服务熔断。
如下图所示,关联模式下针对的是两个资源,大体的意思是,关联的资源如果触发了我们设置的阈值那么设置规则的资源就会被降级或熔断。
假设有如下的调用链
上图中来自入口Entrance1和Entrance2的请求都调用到了资源NodeA,Sentinel允许只根据某个入口的统计信息对资源限流。比如我们可以设置FlowRule.strategy为RuleConstant.CHAIN,同时设置FlowRule.ref_identity为Entrance1 来表示只有从入口Entrance1的调用才会记录到NodeA的限流统计当中,而不关心经Entrance2到来的调用。
调用链的入口(上下文)是通过API方法ContextUtil.enter(contextName)定义的,其中contextName即对应调用链路入口名称。
简单来说就是存在一个资源被许多接口调用,但是我们只关心从某个接口调用过来的流控,那么就可以使用链路模式来进行流控。不过这里的来源我们必须通过API的形式定义。
那么假设有如下的两个controller,都调用了testService的test方法,相当于这个资源的链路有两个入口,这里我们只想控制从getUser进入的请求。
那么我们就可以设置如下的流控规则
这种流控效果是默认的,也是最简单的,它的效果就是超过阈值就会响应错误信息。
它使用的是令牌桶算法,这种流控效果其实存在两个阈值,平时的阈值为我们设置的单机阈值/3
。一旦qps激增,超过我们单机阈值/3
,等待我们设置的预热时长后,就会将阈值重新设置为单机阈值
,如下图所示,平时阈值是3,如果qps超过3,5秒过后阈值变为10。
采用的漏斗算法,又称为匀速排队。如下所示,如果我们这么设置,单机阈值设置的qps为2,相当于每0.5秒只处理一个请求,每个请求的超时时长为1秒,所有的请求都相当于处于一个队列中,而且有序。
官方文档
https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6#%E5%8C%80%E9%80%9F%E6%8E%92%E9%98%9F
官方文档
https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
同样我们可以直接在簇点链路处添加降级规则
降级策略总共有三种
官方文档
https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7#%E9%99%8D%E7%BA%A7%E7%AD%96%E7%95%A5
当1s内持续进入5个请求,对应时刻的平均响应时间(秒级)均超过RT设置的时间,那么会在设置的时间窗口的时间内熔断所有的请求。
当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过上面设置的异常比例,那么资源进入降级状态,在之后设置的时间窗口内对这个方法的调用都会自动地返回进行服务降级。
当资源近1分钟的异常数目超过阈值(上面设置的异常数)之后会进行熔断,熔断的时间就是上面设置的时间窗口,注意这里的时间窗口是分钟级别的,因为小于60s,则结束熔断状态后仍可能再进入熔断状态。
设置服务降级方法,通过@SentinelResource注解实现,这个注解相当于创建了一个资源,这个资源和/getUser资源是两个资源。
blockHandler属性是配置的非程序引起的服务降级,比如qps超过阈值,而且这个降级方法除了可以接收接口传递的参数外还可以接收一个BlockException错误对象。
fallback配置的是由程序内部引起的报错,如下的被0除报错
还可以直接设置blockHandlerClass,将降级方法放入一个专门负责降级的类
注意这里的降级方法必须是静态方法
官方文档
https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
同样我们可以在簇点链路中直接为某个资源添加热点规则
首先我们需要选定需要添加热点规则的参数,这里是根据参数的索引进行选择,这里的阈值是对于这个参数整体的阈值,所以一般会设置正常的数值,统计窗口时长就是多少时间到达阈值。
接着我们需要继续编辑此规则,可以选择参数类型,不过只有7种基本的数据类型
下面就是代表如果第一个参数的值为zdd
这么一个字符串且超过阈值1,那么就会触发限流
官方文档
https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81
在最左侧还有一项系统规则,这里面可以添加各种类型的规则,而且添加的系统规则属于全局规则,可以覆盖我们在前面添加的流控规则、降级规则、热点规则等等。
官方文档
https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81#%E7%B3%BB%E7%BB%9F%E8%A7%84%E5%88%99