五、核心概念
1、Resource
resource是Sentinel中最重要的一个概念,Sentinel通过资源来保护具体的业务代码或其它后方服务。Sentinel把复杂的逻辑给屏蔽了,用户只需要为受保护的代码或服务定义一个资源,然后定义规则就可以了,剩下的通通交给Sentinel来处理。并且资源和规则是解耦的,规则甚至可以在运行时动态修改。定义完资源后,就可以通过在程序中埋点来保护你自己的服务,埋点的方式有两种:
(1)try-catch方式(通过SphU.entry(…)),当catch到BlockException时执行异常处理或fallback。
(2)if-else方式(通过SphO.entry(…)),当返回false时执行异常处理或fallback。
以上两种方式都是通过硬编码的形式定义资源然后进行资源埋点的,对业务代码的侵入太大,从0.1.1版本开始,Sentinel加入了注解的支持,可以通过注解来定义资源,具体的注解为:SentinelResource。通过注解除了可以定义资源外,还可以指定blockHandler和fallback方法。
在Sentinel中具体表示资源的类:ResourceWrapper,它是一个抽象的包装类,包装了资源的Name和EntryType。他有两个实现类,分别是:StringResourceWrapper和MethodResourceWrapper。顾名思义,StringResourceWrapper是通过对一串字符进行包装,是一个通用的资源包装类,MethodResourceWrapper是对方法调用的包装。
2、Context
Context是对资源操作时的上下文环境,每个资源操作(针对resource的entry和exit)必须属于一个Context,如果程序中未指定Context,会创建name为“Sentinel_default_context”的默认Context。一个Context生命周期内可能有多个资源操作,Context生命周期内的最后一个资源exit时会清理该Context,这也预示着整个Context生命周期的结束。Context主要属性如下:
public class Context {
// context名字,默认名字 “sentinel_default_context”
private final String name;
// context入口节点,每个context必须有一个entranceNode
private DefaultNode entranceNode;
// context当前entry,Context生命周期中可能有多个Entry,所有curEntry会有变化
private Entry curEntry;
// The origin of this context (usually indicate different invokers, e.g. service consumer name or origin IP).
private String origin = “”;
private final boolean async;