写作目的

最近在看Sentinel源码,遇到了几个问题,想再此记录和分享一下遇到的几个问题,方便读者看到我的文章后就不用在继续搜





注意:版本要和链接中的一致

原理讲解参考视频

​图灵学院诸葛老师VIP教程一小时搞定限流熔断组件S​​​
​​​尚硅谷-阿里Sentinel核心源码解析19讲​​​​ https://www.bilibili.com/video/BV1My4y1W726​

源码分析总结

限流算法分析

经典的限流算法有:漏斗算法、令牌桶算法和滑动窗口算法
Sentinel使用的是滑动窗口算法
​​RateLimiter使用的是令牌桶

参考:​​​https://www.bilibili.com/video/BV1yb4y1k7hN?p=4​

Sentinel实现原理

AOP

向容器里添加一个Aspect

//SentinelAutoConfiguration
@Bean
@ConditionalOnMissingBean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}

而该Aspect是环绕通知

@Aspect
public class SentinelResourceAspect extends AbstractSentinelAspectSupport {

@Pointcut("@annotation(com.alibaba.csp.sentinel.annotation.SentinelResource)")
public void sentinelResourceAnnotationPointcut() {
}

@Around("sentinelResourceAnnotationPointcut()")
public Object invokeResourceWithSentinel(ProceedingJoinPoint pjp) throws Throwable {
//do something
}


}

责任链

Sentinel源码分析总结_java


里面有很多Slot,每一个Slot的作用无非就是统计和拦截,我们以拦截为例,当经过AuthoritySlot、SystemSlot等规则时,当每一个Slot判断不通过时抛异常,在最外层捕获不同的异常再进行统计,从而实现拦截。

未解决的问题

Sentinel中有一个CommonFilter才是拦截的入口。我debug的时候如果把QPS设置为0.01,那么其实请求是走不到SentinelResourceAspect 的invokeResourceWithSentinel方法的,但是还是抛出了Sentinel的异常,后来发现是在CommonFilter中也执行了

SphU.entry

那么此时问题来了,在Filter中执行一遍上面的方法,又在进入Controller之前的AOP方法中又执行了一遍,这是为什么呢?这个点没有get到。

参考

Nacos服务注册中

服务:
​​​https://gitee.com/cbeann/Demooo/tree/master/sentinel-provider-demo​​​
视频:
​​​图灵学院诸葛老师VIP教程一小时搞定限流熔断组件Sentinel(本文作者推荐)​​​:https://www.bilibili.com/video/BV1yb4y1k7hN?p=1

​​​尚硅谷-阿里Sentinel核心源码解析19讲​​:https://www.bilibili.com/video/BV1My4y1W726