写作目的
最近在看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
}
}
责任链
里面有很多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