这篇文章主要介绍Alibaba中Sentinel骨架的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
创新互联专注于企业全网营销推广、网站重做改版、潼关网站定制设计、自适应品牌网站建设、H5场景定制、商城网站定制开发、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为潼关等各大城市提供网站开发制作服务。
Sentinel 的核心骨架,将不同的 Slot 按照顺序串在一起(责任链模式),从而将不同的功能(限流、降级、系统保护)组合在一起。slot chain 其实可以分为两部分:统计数据构建部分(statistic)和判断部分(rule checking)。核心结构:

业务埋点示例
// 资源的唯一标识
String resourceName = "testSentinel";
Entry entry = null;
String retVal;
try {
entry = SphU.entry(resourceName, EntryType.IN);
// TODO 业务逻辑
retVal = "passed";
} catch (BlockException e) {
// TODO 降级逻辑
retVal = "blocked";
} catch (Exception e) {
// 异常数统计埋点
Tracer.trace(e);
throw new RuntimeException(e);
} finally {
if (entry != null) {
entry.exit();
}
}
这段代码是Sentinel业务埋点示例,通过示例我们可以看出Sentinel对资源的控制入口是SphU.entry(resourceName, EntryType.IN);
,源码如下:
public static Entry entry(String name, EntryType type) throws BlockException {
return Env.sph.entry(name, type, 1, OBJECTS0);
}
这里第一个参数是受保护资源的唯一名称;第二个参数表示流量类型:
这段代码没什么逻辑,只是转发了下,跟进源码可以发现最终逻辑实在CtSph#entryWithPriority(ResourceWrapper, int, boolean, Object...)
方法中。
Sentinel 骨架代码
Sentinel的核心是资源,这里的资源可以是任何东西,服务,服务里的方法,甚至是一段代码。而SphU.entry(resourceName);
这段代码的主要作用是 :
定义一个Sentinel资源
检验资源所对应的规则是否生效
核心代码如下:
private Entry entryWithPriority(ResourceWrapper resourceWrapper, int count, boolean prioritized, Object... args)
throws BlockException {
// 获取当前线程上下文,Context是通过ThreadLocal维护,每一个Context都会有一个EntranceNode实例,它是dashboard【簇点链路】中的根节点,主要是用来区分调用链路的
Context context = ContextUtil.getContext();
if (context instanceof NullContext) {
// 如果是 NullContext,表示 Context 个数超过了阈值,这个时候 Sentinel 不会应用规则,即不会触发限流降级等规则,也不会触发QPS等数据统计。
// 阈值大小 =Constants.MAX_CONTEXT_NAME_SIZE = 2000,具体可以查看 ContextUtil#trueEnter。
return new CtEntry(resourceWrapper, null, context);
}
if (context == null) {
// 如果没有设置上下文,即使用默认上下文,默认上下文的名称是 sentinel_default_context
context = InternalContextUtil.internalEnter(Constants.CONTEXT_DEFAULT_NAME);
}
if (!Constants.ON) {
// Sentinel 的全局控制开关,一旦关闭则不进行任何检查
return new CtEntry(resourceWrapper, null, context);
}
// 通过Sentinel的官方文档我们可以知道,Sentinel的核心功能是基于一系列的功能插槽来实现的,而组织这些功能插槽使用的是责任链模式。
// 这里是通过资源(每个资源是唯一的),获取第一个功能插,即该资源对应的规则入口。
ProcessorSlot