共计 2121 个字符,预计需要花费 6 分钟才能阅读完成。
sentinel 的特色图
sentinel 基本概念
资源
资源是 sentinel 的要害概念,资源能够是 java 利用里的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它利用提供的服务,甚至能够是一段代码。只有通过 Sentinel API 定义的代码,就是资源,可能被 Sentinel 爱护起来。大部分状况下,能够应用办法签名,URL,甚至服务名称作为资源名来标示资源。
规定
围绕资源的实时状态设定的规定,能够包含流量管制规定、熔断降级规定以及零碎爱护规定。所有规定能够动静实时调整。
sentinel 性能与设计理念
流量管制
流量管制在网络传输中是一个罕用的概念,它用于调整网络包的发送数据。然而,从零碎稳定性角度思考,在解决申请的速度上,也有十分多的考究。任意工夫到来的申请往往是随机不可控的,而零碎的解决能力是无限的。咱们须要依据零碎的解决能力对流量进行管制。Sentinel 作为一个调配器,能够依据须要把随机的申请调整成适合的形态,如下图所示:
能够从上面几方面对流量进行调整:
- 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
- 运行指标,例如 QPS、线程池、零碎负载等;
- 管制的成果,例如间接限流、冷启动、排队等。
Sentinel 的设计理念是让您自由选择管制的角度,并进行灵便组合,从而达到想要的成果。
熔断降级
除了流量管制以外,升高调用链路中的不稳固资源也是 Sentinel 的使命之一。因为调用关系的复杂性,如果调用链路中的某个资源呈现了不稳固,最终会导致申请产生沉积。Sentinel 和 Hystrix 的准则是统一的: 当检测到调用链路中某个资源呈现不稳固的体现,例如申请响应工夫长或异样比例升高的时候,则对这个资源的调用进行限度,让申请疾速失败,防止影响到其它的资源而导致级联故障。
熔断降级的设计理念
在限度的伎俩上,Sentinel 和 Hystrix 采取了齐全不一样的办法。Hystrix 通过 线程池隔离 的形式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔离。这样做的益处是资源和资源之间做到了最彻底的隔离。毛病是除了减少了线程切换的老本(过多的线程池导致线程数目过多),还须要事后给各个资源做线程池大小的调配。
sentinel 又是如何做的呢?
- 通过并发线程数进行限度 : 和资源池隔离的办法不同,Sentinel 通过限度资源并发线程的数量,来缩小不稳固资源对其它资源的影响。这样岂但没有线程切换的损耗,也不须要您事后调配线程池的大小。当某个资源呈现不稳固的状况下,例如响应工夫变长,对资源的间接影响就是会造成线程数的逐渐沉积。当线程数在特定资源上沉积到肯定的数量之后,对该资源的新申请就会被回绝。沉积的线程实现工作后才开始持续接管申请。
- 通过响应工夫对资源进行降级 : 除了对并发线程数进行管制以外,Sentinel 还能够通过响应工夫来疾速降级不稳固的资源。当依赖的资源呈现响应工夫过长后,所有对该资源的拜访都会被间接回绝,直到过了指定的工夫窗口之后才从新复原。
零碎负载爱护:
Sentinel 同时提供零碎维度的自适应爱护能力。避免雪崩,是零碎防护中重要的一环。当零碎负载较高的时候,如果还继续让申请进入,可能会导致系统解体,无奈响应。在集群环境下,网络负载平衡会把本应这台机器承载的流量转发到其它的机器下来。如果这个时候其它的机器也处在一个边缘状态的时候,这个减少的流量就会导致这台机器也解体,最初导致整个集群不可用。针对这个状况,Sentinel 提供了对应的爱护机制,让零碎的入口流量和零碎的负载达到一个均衡,保证系统在能力范畴之内解决最多的申请。
应用示例
- 定义资源限流规定:
// 初始化规定
private static void initFlowRules() {List<FlowRule> rules = new ArrayList<>(); // 限流规定的汇合
FlowRule flowRule = new FlowRule();// 限流规定
flowRule.setResource("ruleTest");// 资源(能够是办法名称、接口)// 线程数 (FLOW_GRADE_THREAD) 与 QPS (FLOW_GRADE_QPS)
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 限流的阈值的类型
flowRule.setCount(18);// QPS 数
rules.add(flowRule);
FlowRuleManager.loadRules(rules);
}
-
启动测试类
public static void main(String[] args) {initFlowRules(); // 初始化一个规定 while(true){ Entry entry=null; try{entry= SphU.entry("ruleTest"); System.out.println("Hello Word"); }catch (BlockException e){// 如果被限流了,那么会抛出这个异样 e.printStackTrace();}finally {if(entry!=null){entry.exit();// 开释 } } } }