一、sentinel简介
Sentinel是一个具有流量控制、熔断降级、系统负载保护等多个维度保护服务稳定性的开源框架
二、使用sentinel 的目的
通过使用Sentinel, 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。
当异常发生时,非核心链路走降级策略,降低一定的用户体验来,保证系统的稳定性..
三、使用方式
步骤一: 升级组件版本到1.1.5或者以上
1 2 3 4 5 | <dependency> <groupId>com.sq< /groupId > <artifactId>sq-component-sentinel< /artifactId > <version>1.1.5.1< /version > < /dependency > |
步骤二: 把切面类纳入spring管理
1 2 | <bean class= "com.sq.sentinel.aspectj.SqSentinelResourceAspect" /> Boot工程可以通过注解配置方式 |
步骤三 方法上加注解: SqSentinelResource
1 2 3 4 5 6 7 8 9 10 11 | @SqSentinelResource(configName = "sq-sentinel" , value = "getCompanyBlackDriver" , blockHandler = "getCompanyBlackDriverFallback" ,blockHandlerClass = {BusinessServiceFallback.class}, fallback = "getCompanyBlackDriverFallback" ,fallbackClass = {BusinessServiceFallback.class}) public List<Integer> getCompanyBlackDriver(Integer businessId) { Return null; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | configName:对应配置中心的xml文件名 value: 代表一个资源,名称自定义(必须保证在一个项目里唯一) blockHandler: 当发生降级时会调用指定的函数, 降级函数有两种情况: 1、如果指定的降级函数在本类里,则必须是成员函数 2、不在本类中,则需要指定blockHandlerClass,并且必须是静态函数 blockHandlerClass(可选):当降级函数与被降级的函数不在一个类时,需要指定这个参数,并且降级方法需要声明为 static fallback:当发生降级时没指定blockHandler或者不是降级造成的异常则会进入fallback函数。 fallbackClass:与blockHandlerClass同理 注意点: blockHandler需要与被降级函数 具有同样的返回类型与入参列表,入参列表末尾可以额外加一个BlockException类型入参 fallback需要与被降级函数 具有同样的返回类型与入参列表 降级时调用优先级: blockHandler -> fallback -> defaultFallback |
步骤四 配置中心配置对应的熔断降级规则
1 2 3 4 5 | <?xml version= "1.0" encoding= "utf-8" ?> <config> <value>{ "flow" :[{ "resource" : "flow1" , "grade" :1, "count" :1000}], "degrade" :[{ "resource" : "getCompanyBlackDriver" , "count" :400, "timeWindow" :15, "grade" :0, "rtSlowRequestAmount" :5, "minRequestAmount" :5},{ "resource" : "channelRiskCheck" , "count" :500, "timeWindow" :15, "grade" :0, "rtSlowRequestAmount" :5, "minRequestAmount" :5}]}< /value > < /config > |
步骤五 perf-monitor加入sentinel报警设置
1 2 3 4 5 6 7 8 9 | <!--sentinel监控--> <sentinel> <monitor key= "default" > < quota > <windowSize>1< /windowSize > <failCount>1< /failCount > < /quota > < /monitor > < /sentinel > |
四、配置解释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | { // flow这个代表限流的配置规则 "flow" :[{ "resource" : "flow1" , "grade" :1, "count" :1000 }], // degrade代表降级的配置规则 "degrade" :[ { // 这个resource资源名对应上文的SqSentinelResource的value值 "resource" : "getCompanyBlackDriver" , // 一秒内的平均响应时间ms(N个请求的1秒窗口内的响应时间/请求成功数) "count" :400, // 触发降级后的降级时间窗口期,单位s "timeWindow" :15, // 降级类型, 0 代表按照平均响应时间降级 "grade" :0, // 响应时间请求数阈值, 针对 grade= 0 的情况 "rtSlowRequestAmount" :5, "minRequestAmount" :5 }, { "resource" : "getCompanyBlackDriver" , // 取值 [0,1] "count" :.0.2, "timeWindow" :15, // 1代表按照 每秒钟的异常占比比率降级 "grade" :1, "rtSlowRequestAmount" :5, // 请求数量阈值,针对 grade = 1 的情况 "minRequestAmount" :5 }, { // 这个resource资源名对应上文的SqSentinelResource的value值 "resource" : "getCompanyBlackDriver" , // 一分钟的异常数阈值 "count" :100, "timeWindow" :15, // 根据一分钟的异常数来触发熔断 "grade" :2, "rtSlowRequestAmount" :5, "minRequestAmount" :5 } ] } |