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 滑动窗口组合

image

image

image

windowlengthinms 窗口原子大小

intervalinms 统计时间单位,比如分钟/秒

在com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager.RulePropertyListener#buildCircuitBreakers中根据界面操作设定第二个参数

image

第一个参数始终是1

 

posted on 2025-07-13 23:11  silyvin  阅读(6)  评论(0)    收藏  举报