Sentinel根据设定的资源名称构造相应的资源,同时也根据设定的规则创建一系列功能槽。这些功能槽在访问资源之前,会进行相应的数据统计和降级验证,保证分布式场景下服务的稳定性。1.sentinel的featuremap2.sentinel的基本概念Resource Resource是sentinel的关键概念。资源可以是java应用程序中的任何内容,例如应用程序提供的服务,或者应用程序服务调用的其他应用程序提供的服务,甚至是一段代码。只要SentinelAPI定义的代码是资源,就可以被Sentinel保护。在大多数情况下,您可以使用方法签名、URL甚至服务名称作为资源名称来标识资源。规则 围绕资源实时状态设置的规则,包括流量控制规则、熔断降级规则、系统保护规则。所有规则都可以实时动态调整。3.Sentinel功能及设计理念流量控制 流量控制是网络传输中常用的概念,用于调整网络数据包的发送数据。但是,从系统稳定性的角度来看,处理请求的速度也有很大的讲究。随时到来的请求往往是随机的、不可控的,系统的处理能力是有限的。我们需要根据系统的处理能力来控制流量。Sentinel作为调节器,可以根据需要将随机请求调整成合适的形状,如下图:运行指标,如QPS、线程池、系统负载等;控制效果,如直接限流、冷启动、排队等。Sentinel的设计理念是让你自由选择控制角度,灵活组合,达到想要的效果。熔断降级 除了流量控制,减少调用环节的不稳定资源也是Sentinel的使命之一。由于调用关系的复杂性,如果调用环节中某个资源变得不稳定,请求最终会堆积起来。Sentinel和Hystrix的原理是一样的:当检测到调用链路中某个资源性能不稳定,比如请求响应时间过长或者异常比例增加时,限制对该资源的调用进行请求fast故障,避免影响其他资源,造成级联故障。断路器降级的设计理念 Sentinel和Hystrix在限制手段上采用了完全不同的方式。Hystrix通过线程池隔离来隔离依赖(对应Sentinel概念中的资源)。这样做的好处是资源之间实现了最彻底的隔离。缺点是除了增加线程切换的成本(线程池太多导致线程太多),还需要提前为每个资源分配线程池的大小。 哨兵是怎么做到的呢?并发线程数限制:与资源池隔离的方式不同,Sentinel通过限制资源的并发线程数来减少不稳定资源对其他资源的影响。这样,不仅没有线程切换的损失,也不需要你预先分配线程池的大小。当资源变得不稳定时,比如响应时间变长,对资源的直接影响就是线程数会逐渐积累。在特定资源上的线程数量累积到一定数量后,将拒绝对该资源的新请求。累积的线程在完成任务后继续接收请求。通过响应时间降级资源:除了控制并发线程数,Sentinel还可以通过响应时间快速降级不稳定的资源。当依赖资源的响应时间过长时,将直接拒绝对该资源的所有访问,并在指定的时间窗口过后才恢复。系统负载保护: Sentinel也提供了系统维度的自适应保护能力。防止雪崩是系统保护的重要组成部分。当系统负载较高时,如果请求不断进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会将本应由本机承载的流量转发给其他机器。如果此时其他机器也处于边缘状态,增加的流量会导致这台机器崩溃,最终导致整个集群不可用。针对这种情况,Sentinel提供了相应的保护机制,在系统的入口流量和系统的负载之间取得平衡,保证系统在能力范围内处理最多的请求。四、Sentinel中的NodeNode用于保存实时统计指标数据。Node接口定义了一个Node类需要提供的各种指标数据统计的相关函数,对外屏蔽了滑动窗口的存在。提供记录请求被拒绝、请求被释放、请求处理异常、请求处理成功的方法,以及获取当前时间窗口内请求总数和平均耗时统计的方法。publicinterfaceNodeextendsOccupySupport,DebugSupport{longtotalRequest();//获取请求总数longtotalPass();//获取通过的请求总数longtotalSuccess();//获取成功请求总数longblockRequest();//获取被Sentinel拒绝的请求总数longtotalException();//获取异常总数doublepassQps();//传QPSdoubleblockQps();//拒绝QPSdoubletotalQps();//总qpsdoublesuccessQps();//成功qpsdoublemaxSuccessQps();//最大成功总QPS(比如默认配置二级滑动窗口的数组大小为2,则取数组中最大的)doubleexceptionQps();//QPS异常doubleavgRt();//平均耗时doubleminRt();//最小耗时intcurThreadNum();//当前并发占用的线程数doublepreviousBlockQps();//拒绝上一个时间窗口的qpsdoublepreviousPassQps();//一个时间窗口的PreviousPassqpsMap
