先来看下和Hystrix的对比
从一个基本的demo 看起 FlowQpsDemo, 直接看程序入口main
1.初始化流量统计的规则 rule
2.计时 tick() 方法
3.模拟流量,调用simulateTraffic
可以看到,Sentinel 核心功能,都是依赖于降级,限流的各种规则。都定义在slots目录下,分为鉴权authority,降级degrade和流量监测,限流flow
继续看FlowQpsDemo ,使用TimerTask来计时。 之前初始化规则的时候,已经设定qps限流20
下图是RunTask 来模拟请求
1.继续调用到CtSph的entry方法,继续调用到entryWithPriority
2.校验上下文context为空,就是用默认的context
3.检查全局global Switch,如果关闭,就无需检查其他的规则rule,直接返回
4.如果没有关闭,就获取执行链,也就是很多slot组成的chain
5.继续调用chain.entry,也就是各个slot的entry实现,这里看下flowSlot
6. 会调用checkFlow,调用到FlowRuleChecker
7.首先获取设定好的规则 rules,然后循环规则,每个rule都调用canPassCheck来检查是否可以通过。如果不能通过,则抛出FlowException异常
8.如果是集群模式,就调用passClusterCheck;我们这里看下passLocalCheck
根据策略选择出一个selectNode,继续调用canPass判断能否通过
1.策略为直接,也就是调用方的node;不为直接,在集群环境中获取对应关联资源的node
1.计算出当前的数量curCount,已消耗令牌数量
2.如果当前计数curCount + acquireCount > count (流控规则配置的阈值count),则进行限流处理
9.继续调用requestToken,最后通过Transport层(底层channel)发送调用请求,并且获取结果response
11.校验通过的结果,调用applyTokenResult,对结果进行处理;
OK : 本请求可以执行
SHOULD_WAIT : 请求应该等待,就休眠一段时间
12.执行完成后,继续调用entry,执行chain上面的下一个slot