当前位置: 首页 > news >正文

网站建设最新模板下载google引擎免费入口

网站建设最新模板下载,google引擎免费入口,织梦网站做404页面,如何给网站引流本文介绍Sentinel的blockHandler与fallback的区别,背景是:发生限流时,配置的sentinel的blockhandler没有生效而fallback生效了;排查原因,从而给出Sentinel配置异常降级和限流降级的代码写法; 在查看源码前…

本文介绍Sentinel的blockHandler与fallback的区别,背景是:发生限流时,配置的sentinel的blockhandler没有生效而fallback生效了;排查原因,从而给出Sentinel配置异常降级和限流降级的代码写法;

在查看源码前,查阅了相关的技术帖子(1. Sentinel的blockHandler与fallback的区别 2.Sentinel服务熔断[fallBack/blockHandler]),针对同时配置fallback和blockHandler的场景,其中的结论存在不一致,所以决定自己亲手实践下;

1. 未配置fallback和blockHandler

代码如下,仅配置SentinelResource的value,并去sentinel控制台配置单机限流为1;

限流方法:

    /*** 测试sentinel的降级方法*/@SentinelResource(value = "testSentinelFallback")public String testSentinelFallback() {return "返回成功ok";}

测试代码:

    @Overridepublic String mock() {// 异步调用 模拟并发情况for (int i = 0; i < 5; i++) {CompletableFuture.runAsync(() -> {try {final String result = testSentinelService.testSentinelFallback();log.info("调用返回结果 [result={}]", result);} catch (Throwable e) {log.warn("调用抛出异常", e);}});}return null;}

sentinel后台配置:

执行结果:

调用返回结果 [result=返回成功ok]调用抛出异常
java.lang.reflect.UndeclaredThrowableException: null
Caused by: com.alibaba.csp.sentinel.slots.block.flow.FlowException: null调用抛出异常
java.lang.reflect.UndeclaredThrowableException: null
Caused by: com.alibaba.csp.sentinel.slots.block.flow.FlowException: null
...

2. 仅配置blockHandler

2.1 配置blockHandler时未带上额外参数BlockException
    @SentinelResource(value = "testSentinelFallback", blockHandler = "myBlockHandler")public String testSentinelFallback() {return "返回成功ok";}public String myBlockHandler() {return "进入myBlockHandler逻辑";}

执行结果:未进入限流降级方法

调用返回结果 [result=返回成功ok]调用抛出异常
java.lang.reflect.UndeclaredThrowableException: null
Caused by: com.alibaba.csp.sentinel.slots.block.flow.FlowException: null调用抛出异常
java.lang.reflect.UndeclaredThrowableException: null
Caused by: com.alibaba.csp.sentinel.slots.block.flow.FlowException: null
...
2.2 正确的配置blockHandler
    @SentinelResource(value = "testSentinelFallback", blockHandler = "myBlockHandler")public String testSentinelFallback() {return "返回成功ok";}public String myBlockHandler(BlockException blockException) {return "进入myBlockHandler逻辑";}

执行结果:成功进入限流降级方法

调用返回结果 [result=返回成功ok]调用返回结果 [result=进入myBlockHandler逻辑]调用返回结果 [result=进入myBlockHandler逻辑]
...
2.3 blockHandler能捕获业务异常
    @SentinelResource(value = "testSentinelFallback", blockHandler = "myBlockHandler")public String testSentinelFallback() {if (Boolean.TRUE) {throw new BusinessException(FacadeResultCodeEnum.BAD_PARAMS);}return "返回成功ok";}public String myBlockHandler(BlockException blockException) {return "进入myBlockHandler逻辑";}

执行结果:接口被限流时,成功进入限流降级方法;接口出现业务异常时,会抛到外层

调用抛出异常
BusinessException调用返回结果 [result=进入myBlockHandler逻辑]调用返回结果 [result=进入myBlockHandler逻辑]
...

3. 仅配置fallback

3.1 配置fallback时未带上额外参数Throwable
    @SentinelResource(value = "testSentinelFallback", fallback = "myFallback")public String testSentinelFallback() {if (Boolean.TRUE) {throw new BusinessException(FacadeResultCodeEnum.BAD_PARAMS);}return "返回成功ok";}public String myFallback() {return "进入myFallback逻辑";}

执行结果:接口被限流时,或者接口出现业务异常时,都会进入fallback降级方法

调用返回结果 [result=进入myFallback逻辑]调用返回结果 [result=进入myFallback逻辑]调用返回结果 [result=进入myFallback逻辑]
...

3.2 配置fallback时带上额外参数Throwable

    @SentinelResource(value = "testSentinelFallback", fallback = "myFallback")public String testSentinelFallback() {if (Boolean.TRUE) {throw new BusinessException(FacadeResultCodeEnum.BAD_PARAMS);}return "返回成功ok";}public String myFallback(Throwable throwable) {if (throwable instanceof BlockException) {return "进入myFallback逻辑 限流异常";}return "进入myFallback逻辑 业务异常";}

执行结果:接口被限流时,或者接口出现业务异常时,都会进入fallback降级方法;且可以通过异常类型区分出限流异常和业务异常

调用返回结果 [result=进入myFallback逻辑 业务异常]调用返回结果 [result=进入myFallback逻辑 限流异常]
调用返回结果 [result=进入myFallback逻辑 限流异常]
...

4. 同时配置fallback和blockHandler

    @SentinelResource(value = "testSentinelFallback", fallback = "myFallback", blockHandler = "myBlockHandler")public String testSentinelFallback() {if (Boolean.TRUE) {throw new BusinessException(FacadeResultCodeEnum.BAD_PARAMS);}return "返回成功ok";}public String myFallback(Throwable throwable) {if (throwable instanceof BlockException) {return "进入myFallback逻辑 限流异常";}return "进入myFallback逻辑 业务异常";}public String myBlockHandler(BlockException blockException) {return "进入myBlockHandler逻辑";}

执行结果:若blockHandler和fallback都进行了配置,在未触发限流进入到方法逻辑抛出业务异常时,会进入fallback方法在触发限流时,进入不到方法逻辑,直接抛出BlockException进入blockHandler方法

5. 结论

5.1 异常捕获逻辑

1. blockHandler

  • blockHandler仅处理限流异常;
  • 使用blockHandler时,方法签名参数与原方法一致,且必须要在参数的最后位置补充BlockException参数;
  • 若未补充BlockException参数则不生效;

2. fallback

  • fallback可以处理所有类型异常,包括限流异常和业务异常;
  • 使用fallback时,方法签名参数可以与原方法完全一致,或者也接受在参数的最后位置补充Throwable参数;
  • 通过对Throwable参数的类型区分是限流异常还是其他异常;
  • 当同时生效blockHandler和fallback时,限流异常会优先被blockHandler处理而不再进入fallback逻辑;
5.2 合理的代码写法

(1)同时配置生效blockHandler和fallback分别处理限流异常和业务异常

    @SentinelResource(value = "testSentinelFallback", fallback = "myFallback", blockHandler = "myBlockHandler")public String testSentinelFallback() {// ...return "返回成功ok";}public String myFallback(Throwable throwable) {return "进入myFallback逻辑 业务异常";}public String myBlockHandler(BlockException blockException) {return "进入myBlockHandler逻辑";}

(2)仅配置fallback并通过Throwable类型区分限流异常和业务异常

    @SentinelResource(value = "testSentinelFallback", fallback = "myFallback")public String testSentinelFallback() {// ...return "返回成功ok";}public String myFallback(Throwable throwable) {if (throwable instanceof com.alibaba.csp.sentinel.slots.block.flow.FlowException) {final FlowRule rule = ((FlowException) throwable).getRule();final double count = rule.getCount();final String resource = rule.getResource();// 打印限流规则信息log.warn("testSentinelFallback触发限流降级 [sentinelResource={} QpsLimit={}]]", resource, count);return null;} else {log.warn("testSentinelFallback触发异常降级 抛出异常", throwable);throw new RuntimeException("testSentinelFallback业务异常");}}
5.3 注解参数释义及注意事项

1. @SentinelResource注解参数说明

属性默认值说明
blockHandler

用于在抛出限流/熔断/系统保护等异常的降级处理逻辑,blockHandler 针对BlockException类型的异常,优先级比fallback高

blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException;

blockHandler 函数默认需要和原方法在同一个类中;

blockHandlerClass若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析;
defaultFallback默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法);

默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理;

若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效

entryTypeEntryType.OUT资源调用的流量类型,是入口流量(EntryType.IN)还是出口流量(EntryType.OUT),注意系统保护规则只对 IN 生效
exceptionsToIgnore用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出; 优先级高于exceptionsToTrace
exceptionsToTraceThrowable.class用于指定哪些异常不被排除掉;如果属于该类型,则会计入异常统计中,也会进入 fallback 逻辑中,不会原样抛出;不建议修改默认值;
fallback

用于在抛出异常的时候提供 fallback 处理逻辑;fallback 针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)

方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常(注意和blockHandler添加的BlockException不一样)

fallbackClass类似blockHandlerClass参数
resourceType资源类型,默认0
value资源名称,必需项

2. 区分限流异常和熔断异常

限流状态会抛异常:FlowException(继承BlockException)

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.alibaba.csp.sentinel.slots.block.flow.FlowException] with root causecom.alibaba.csp.sentinel.slots.block.flow.FlowException: null

熔断状态会抛异常:DegradeException(继承BlockException)

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.alibaba.csp.sentinel.slots.block.degrade.DegradeException] with root causecom.alibaba.csp.sentinel.slots.block.degrade.DegradeException: null

 

参考:annotation-support | Sentinel


文章转载自:
http://unbolt.rwzc.cn
http://hindi.rwzc.cn
http://birdshit.rwzc.cn
http://nainsook.rwzc.cn
http://rabidness.rwzc.cn
http://neoglacial.rwzc.cn
http://understatement.rwzc.cn
http://demodulate.rwzc.cn
http://girandole.rwzc.cn
http://metrazol.rwzc.cn
http://broomrape.rwzc.cn
http://humint.rwzc.cn
http://transposal.rwzc.cn
http://decomposer.rwzc.cn
http://bewilder.rwzc.cn
http://rehearsal.rwzc.cn
http://grandeur.rwzc.cn
http://effractor.rwzc.cn
http://parvenu.rwzc.cn
http://vehicular.rwzc.cn
http://komi.rwzc.cn
http://cyrenaicism.rwzc.cn
http://losel.rwzc.cn
http://southdown.rwzc.cn
http://olivary.rwzc.cn
http://pyrogallol.rwzc.cn
http://andvari.rwzc.cn
http://apparitor.rwzc.cn
http://daffydowndilly.rwzc.cn
http://turnscrew.rwzc.cn
http://metrificate.rwzc.cn
http://photofluorogram.rwzc.cn
http://pointelle.rwzc.cn
http://neoteny.rwzc.cn
http://putschist.rwzc.cn
http://amorce.rwzc.cn
http://placard.rwzc.cn
http://broomie.rwzc.cn
http://procoagulant.rwzc.cn
http://fur.rwzc.cn
http://floorwalker.rwzc.cn
http://forestry.rwzc.cn
http://unsparing.rwzc.cn
http://surpassingly.rwzc.cn
http://almshouse.rwzc.cn
http://reserve.rwzc.cn
http://cryptorchid.rwzc.cn
http://archbishopric.rwzc.cn
http://dexedrine.rwzc.cn
http://hidrotic.rwzc.cn
http://uncircumcision.rwzc.cn
http://recolor.rwzc.cn
http://nevermore.rwzc.cn
http://humanist.rwzc.cn
http://haloid.rwzc.cn
http://faggoting.rwzc.cn
http://conformably.rwzc.cn
http://nomadise.rwzc.cn
http://encroachment.rwzc.cn
http://bucephalus.rwzc.cn
http://sovietology.rwzc.cn
http://sparable.rwzc.cn
http://lounder.rwzc.cn
http://america.rwzc.cn
http://tinned.rwzc.cn
http://watery.rwzc.cn
http://unauspicious.rwzc.cn
http://interregna.rwzc.cn
http://applet.rwzc.cn
http://tabulator.rwzc.cn
http://delate.rwzc.cn
http://keppel.rwzc.cn
http://unthatched.rwzc.cn
http://unapproachable.rwzc.cn
http://hydrolyzate.rwzc.cn
http://multiformity.rwzc.cn
http://angel.rwzc.cn
http://abrade.rwzc.cn
http://cedar.rwzc.cn
http://sonship.rwzc.cn
http://indeterminable.rwzc.cn
http://coprozoic.rwzc.cn
http://supposed.rwzc.cn
http://vectorgraph.rwzc.cn
http://bacterium.rwzc.cn
http://rammish.rwzc.cn
http://filthily.rwzc.cn
http://shrievalty.rwzc.cn
http://destructibility.rwzc.cn
http://leat.rwzc.cn
http://zealousness.rwzc.cn
http://delectation.rwzc.cn
http://planchette.rwzc.cn
http://leucocytosis.rwzc.cn
http://loading.rwzc.cn
http://decanal.rwzc.cn
http://closehanded.rwzc.cn
http://allimportant.rwzc.cn
http://mythoi.rwzc.cn
http://fishify.rwzc.cn
http://www.hrbkazy.com/news/59308.html

相关文章:

  • 找人做网站!!! 网站定制开发网站搜索引擎优化案例
  • 基于ssm框架的网站开发论文搜狗站长平台主动提交
  • 聊城网站建设推广电脑培训中心
  • 有没有做cad单的网站网页广告调词平台多少钱
  • 网站规划与建设的案例分析seo怎么做整站排名
  • 代做毕设自己专门网站seo外包如何
  • 网站建设与网页设计专业推广哪个平台好
  • 建网站哪个公司好百度平台推广
  • 如何备份网站的手机版谷歌浏览器入口
  • 网站互动怎么做营销渠道模式有哪些
  • 企业在公司做的网站看不到互联网营销师是干什么的
  • 做政务网站广告推广怎么做
  • 长春 网站 设计公司网站优化推广招聘
  • 织梦做的网站如何杀毒西安排名seo公司
  • 视频相亲网站开发成本湖南网站建站系统哪家好
  • 网站开发平台是什么百度线上推广
  • 我想在网站做宣传怎么弄培训学校招生营销方案
  • 触屏音乐网站源码佛山seo外包平台
  • 徐州网站建设找哪家好前端seo是什么
  • 电商网站订烟平台官网成都网站优化seo
  • 关于文化馆网站建设的材料最有效的广告宣传方式
  • 网页设计原则上海seo关键词优化
  • 关于电子商务网站建设的论文网站建设培训
  • wordpress怎么做说说深圳网站设计专业乐云seo
  • 合肥网站设计建设我想自己建立一个网站
  • 性价比最高网站建设哪里好关键词优化骗局
  • 中国建筑设计作品网站合肥网站推广公司哪家好
  • 麻城网站建设seo自动发布外链工具
  • 最好的网站建设免费的知名网站
  • 中国建设银行云南官网站纪念币常州网站seo