环境搭建
Nacos服务注册中心安装:https://cbeann.blog.csdn.net/article/details/105435181
sentinel安装:https://cbeann.blog.csdn.net/article/details/105461870
服务:https://gitee.com/cbeann/Demooo/tree/master/sentinel-provider-demo
注意:版本要和链接中的一致
源码分析总结
限流算法分析
经典的限流算法有:漏斗算法、令牌桶算法和滑动窗口算法
Sentinel使用的是滑动窗口算法
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://cbeann.blog.csdn.net/article/details/105435181
sentinel安装:https://cbeann.blog.csdn.net/article/details/105461870
服务:
https://gitee.com/cbeann/Demooo/tree/master/sentinel-provider-demo