当前位置: 首页 > 后端技术 > Java

sentinel介绍

时间:2023-04-01 19:18:30 Java

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();//一个时间窗口的PreviousPassqpsMapmetrics();ListrawMetricsInMin(PredicatetimePredicate);voidaddPassRequest(intcount);//添加通过请求计数voidaddRtAndSuccess(longrt,intsuccess);//加上请求成功的次数,加上处理成功的耗时过程voidincreaseBlockQps(intcount);//添加被拒绝的请求数voidincreaseExceptionQps(intcount);//添加异常请求数voidincreaseThreadNum();//自增占用线程voiddecreaseThreadNum();//自减占用线程voidreset();//重置滑动窗口}itsnumber两个实现类:DefaultNode、ClusterNode、EntranceNode、StatisticNode的关系如下图所示。呼叫链路的节点、呼叫来源等信息。Context通过ThreadLocal传递,只在调用链接的入口处创建。Entry调用Context#getCurNode方法获取调用链接上当前访问的资源的DefaultNode时,实际上是从Context#curEntry中获取的。Entry维护着当前资源的DefaultNode和调用源的StatisticNode。六、SentinelProcessorSlot处理器槽中的ProcessorSlot是Sentinel实现限流降级、熔断降级、系统自适应降级等功能的入口。Sentinel提供的ProcessorSlot分为两类:一类是入口点,辅助完成资源索引数据统计;另一个是实现降级功能的入口。辅助资源指标数据统计的ProcessorSlotNodeSelectorSlot:为当前资源创建一个DefaultNode,负责收集资源路径,将这些资源的调用路径存储在树形结构中,用于根据调用路径进行限流降级;ClusterBuilderSlot:用于存储资源统计和调用者信息,如资源的RT、QPS、线程数等,将作为多维度限流降级的依据;StatisticSlot:最重要的类之一,用于记录和统计不同纬度的Runtime指标监控信息。每次判断请求是否放行后,会根据判断结果对对应的索引数据进行统计操作ProcessorSlotAuthoritySlot实现降级功能:实现黑白名单降级SystemSlot:实现自适应降级systemFlowSlot:实现限流和降级资源限流规则://初始化规则privatestaticvoidinitFlowRules(){Listrules=newArrayList<>();//限流规则集合FlowRuleflowRule=newFlowRule();//限流规则flowRule.setResource("ruleTest");//Resource(可以是方法名,接口)//线程数(FLOW_GRADE_THREAD)和QPS(FLOW_GRADE_QPS)flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//限流阈值类型flowRule.setCount(18);//QPS个数rules.add(flowRule);FlowRuleManager.loadRules(规则);}启动测试类publicstaticvoidmain(String[]args){initFlowRules();//初始化一条规则while(true){entryentry=null;try{entry=SphU.entry("ruleTest");System.out.println("你好词");}catch(BlockExceptione){//如果限流,会抛出这个异常e.printStackTrace();}最后{if(entry!=null){entry.exit();//Release}}}}参考文章:05Sentinel的一些概念和核心类介绍