上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.4 小结
在处理一次请求的过程中,Sentinel会为调用链上的每个资源都创建一个CtEntry实例,每个CtEntry实例引用资源对应的ProcessorSlotChain。CtEntry维护双向链表的目的:在下一个资源方法执行结束时,能够将Context实例引用的CtEntry实例回退为引用上一个资源方法的CtEntry实例,以便随时通过Context实例获取当前资源的ProcessorSlotChain。
Sentinel的整体工作流程可总结如下。
(1)调用ContextUtil#enter方法创建Context实例,创建的Context实例会被存储到ThreadLocal中,在调用链上可以随时获取该Context实例。
(2)调用SphU#entry方法创建CtEntry实例,调用ProcessorSlotChain#entry方法。如果是首次访问资源,则需要为资源创建ProcessorSlotChain。注册在ProcessorSlotChain上的每个ProcessorSlot都是一个流量切入点。
(3)若在调用SphU#entry方法时抛出BlockException,则说明当前请求被拒绝;若在调用业务方法时抛出异常,则会收集异常指标数据。
(4)在调用SphU#entry方法后,需要确保调用一次SphU#entry方法返回的Entry实例的exit方法,并由Entry实例调用ProcessorSlotChain的exit方法。
(5)在调用ContextUtil#entry方法后,需要确保调用一次ContextUtil#exit方法,将Context实例从ThreadLocal中移除。