sentinel 1.7.2
1 sentinel如何拒绝的
拦截器
2 点击界面上的降级查询降级列表
会触发com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager#getRules
3 新增降级
com.alibaba.csp.sentinel.property.DynamicSentinelProperty#updateValue


com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager.RulePropertyListener#configUpdate
com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager.RulePropertyListener#reloadFrom

看到windowLength就是1秒

4 运行代码 进入sentinel拦截器
com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot#performChecking

可以看到currentState是CLOSED
com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.AbstractCircuitBreaker#tryPass

直接放行
重点,跑完后定义state的方法
:com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot#exit

com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.ResponseTimeCircuitBreaker#onRequestComplete


关键在于,slowCount怎么来的,怎么去的
SlowRequestCounter counter = (SlowRequestCounter)this.slidingCounter.currentWindow().value();
com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.ResponseTimeCircuitBreaker#handleStateChangeWhenThresholdExceeded

com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.ResponseTimeCircuitBreaker#minRequestAmount

5 jmeter压一下,为了一秒内超过5个请求(com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.ResponseTimeCircuitBreaker#minRequestAmount)
开20个线程

可以看到recoveryTimeoutMs已经变少
进入定义好的feign fallback


立即返回没有5秒超时



注意断点的时候容易先触发order feign的请求超时
删除降级规则:

附录:
平均响应时间 (DEGRADE_GRADE_RT):当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule 中的timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回(抛出 DegradeException)。在下一个时间窗口到来时, 会接着再放入5个请求, 再重复上面的判断.
6 window怎么存的
ringbuffer,当前秒时间戳/1秒 % 桶 = 数组中的索引
com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.ResponseTimeCircuitBreaker#onRequestComplete
com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.AbstractCircuitBreaker#tryPass
com.alibaba.csp.sentinel.slots.statistic.base.LeapArray
private int calculateTimeIdx(/*@Valid*/ long timeMillis) {
long timeId = timeMillis / windowLengthInMs;
// Calculate current index so we can map the timestamp to the leap array.
return (int)(timeId % array.length());
}
protected long calculateWindowStart(/*@Valid*/ long timeMillis) {
return timeMillis - timeMillis % windowLengthInMs;
}
本质是ringbuffer,windowstart来判别是否ring过了
7 滑动窗口组合



windowlengthinms 窗口原子大小
intervalinms 统计时间单位,比如分钟/秒
在com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager.RulePropertyListener#buildCircuitBreakers中根据界面操作设定第二个参数

第一个参数始终是1
浙公网安备 33010602011771号