游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

SpringBoot使用Resilience4j容错熔断重试

  Resilience4j是一个轻量级、易于使用的轻量级容错包。它受NeflixHystrix启发但只有一个依赖(Vavr),而不像Hystrix很多很多的依赖。
  Resilience4j在容错方面提供了各种模式:断路器(CircuitBreaker)、重试(Retry)、限时器(TimeLimiter)、限流器(RateLimiter)、隔板(BulkHead)。
  在SpringBoot下,Resilience4j比Hystrix更适合用在容错的各种模式下。我们只要在程序中使用简单的注解即可实现。
  那我们新建一个演示项目来演示功能:
  暂时的依赖只需要SpringWeb、SpringBootActuator。1、项目准备1。1添加Resilience4j依赖
  在SpringBoot下使用Resilience4j,需要加上下面两个依赖gradle:implementationio。github。resilience4j:resilience4jspringboot2:1。7。1implementationorg。springframework。boot:springbootstarteraopmaven:dependencygroupIdio。github。resilience4jgroupIdresilience4jspringboot2artifactIdversion1。7。1veriondependencydependencygroupIdorg。springframework。bootgroupIdspringbootstarteraopartifactIddependency
  2、断路器(CircuitBreaker)
  断路器来自于生活中的断路器,是指当电流超过规定值时,以本身产生的热量使熔体熔断,断开电路的一种电器。
  软件开发中的断路器有三个状态:
  关闭(CLOSED):正常情况,所有的请求都正常通过断路器,没有任何限制。
  打开(OPEN):在过去的请求或者时间中,如果故障或者慢的响应率大于或者等于一个配置的阈值,断路器就会打开。在这种情况下,所有的请求都会受到限制。
  半开(HALFOPEN):在打开状态下经过可配置的等待时间后,断路器允许少量(数值可配置)的请求通过。若失败慢响应超过阈值,断路器重新打开;低于阈值,则断路器进入关闭状态。
  断路器通过限制上游服务调用,在下游服务在部分或者全部停止服务的情况下,对下游服务进行保护。
  我们新建控制器,并在当前的控制器上编写断路器的相关代码:RestControllerpublicclassResilience4jController{privatefinalRestTemplaterestTemplate;publicResilience4jController(RestTemplateBuilderbuilder){this。restTemplatebuilder。build();}GetMapping(circuitbreaker)CircuitBreaker(namecircuitBreakerDemo)publicStringcircuitBreaker(){returnrestTemplate。getForObject(http:nosuchsiteapiexternal,String。class);}}
  我们在控制器方法circuitBreaker()调用下游的服务,本例演示中的下游服务并不存在。
  我们可以简单的在方法上使用CircuitBreaker注解即可使用Resilience4j提供的断路器,name中定义的circuitBreakerDemo是当前断路器的名称。
  我们可以通过application。properties对断路器的具体行为进行配置,instances后面的名称是在CircuitBreaker中配置的名字:resilience4j。circuitbreaker。instances。circuitBreakerDemo。slidingwindowtypeCOUNTBASEDresilience4j。circuitbreaker。instances。circuitBreakerDemo。slidingwindowsize10resilience4j。circuitbreaker。instances。circuitBreakerDemo。failureratethreshold50resilience4j。circuitbreaker。instances。circuitBreakerDemo。permittednumberofcallsinhalfopenstate3resilience4j。circuitbreaker。instances。circuitBreakerDemo。minimumnumberofcalls5resilience4j。circuitbreaker。instances。circuitBreakerDemo。waitdurationinopenstate5s
  1、slidingwindowtype:断路器的滑动窗口期类型可以基于次数(COUNTBASED)或者时间(TIMEBASED)进行熔断,默认是COUNTBASED。
  2、failureratethreshold:设置50的调用失败时打开断路器。
  3、slidingwindowsize:若COUNTBASED,则10次调用中有50失败(即5次)打开熔断断路器;若为TIMEBASED则,此时有额外的两个设置属性,含义为:在秒内(slidingwindowsize)100(slowcallratethreshold)的请求超过2秒(slowcalldurationthreshold)打开断路器。resilience4j。circuitbreaker。instances。circuitBreakerDemo。slowcallratethreshold100resilience4j。circuitbreaker。instances。circuitBreakerDemo。slowcalldurationthreshold2000
  4、permittednumberofcallsinhalfopenstate:运行断路器在HALFOPEN状态下时进行3次调用,如果故障或慢速调用仍然高于阈值,断路器再次进入打开状态。
  5、minimumnumberofcalls:在每个滑动窗口期,配置断路器计算错误率或者慢调用率的最小调用数。本例中设置的5意味着,在计算故障率之前,必须至少调用5次。如果只记录了4次,即使4次都失败了,断路器也不会进入到打开状态。
  6、waitdurationinopenstate:一旦断路器是打开状态,它会拒绝请求5秒钟,然后转入半开状态。
  更多关于断路器的配置可参考官方文档:https:resilience4j。readme。iodocscircuitbreakercreateandconfigureacircuitbreaker2。1断路器的Acturator
  在application。properties里添加相关的配置:management。endpoints。web。exposure。includemanagement。endpoint。health。showdetailsalways显示断路器的健康状态management。health。circuitbreakers。enabledtrueresilience4j。circuitbreaker。instances。circuitBreakerDemo。registerhealthindicatortrue2。3断路器的异常处理
  当断路器处于打开和半开状态时,会抛出CallNotPermittedException异常,我们可以来进行全局处理。RestControllerAdvicepublicclassResilience4jExceptionHandler{ExceptionHandler({CallNotPermittedException。class})ResponseStatus(HttpStatus。SERVICEUNAVAILABLE)publicStringhandleCallNotPermittedException(){return调用不被允许;}}2。4演示效果
  启动程序,用postman访问:http:localhost:8080circuitbreaker,调用5次。第6次,断路器被打开:
  健康状态
  访问:http:localhost:8080actuatorhealth
  指标
  访问:http:localhost:8080actuatormetrics
  我们可以继续访问:
  http:localhost:8080actuatormetricsresilience4j。circuitbreaker。buffered。calls
  http:localhost:8080actuatormetricsresilience4j。circuitbreaker。calls
  http:localhost:8080actuatormetricsresilience4j。circuitbreaker。failure。rate
  http:localhost:8080actuatormetricsresilience4j。circuitbreaker。not。permitted。calls
  http:localhost:8080actuatormetricsresilience4j。circuitbreaker。slow。call。rate
  http:localhost:8080actuatormetricsresilience4j。circuitbreaker。slow。call
  http:localhost:8080actuatormetricsresilience4j。circuitbreaker。state
  事件
  http:localhost:8080actuatorcircuitbreakerevents
  http:localhost:8080actuatorcircuitbreakerevents{name}{eventType}
  http:localhost:8080actuatorcircuitbreakerevents{name}
  http:localhost:8080actuatorcircuitbreakers
  http:localhost:8080actuatorcircuitbreakers{name}
  3、重试(Retry)
  重试在远程服务调用时是必须的能力。我们在控制器中添加演示重试的控制器方法:RestControllerpublicclassResilience4jController{privatefinalRestTemplaterestTemplate;publicResilience4jController(RestTemplateBuilderbuilder){this。restTemplatebuilder。build();}GetMapping(retry)Retry(nameretryDemo,fallbackMethodfallback)publicStringretry(){returnrestTemplate。getForObject(http:nosuchsiteapiexternal,String。class);}publicStringfallback(Exceptionexception){return系统故障,无法访问;}}
  同样,我们可以用Retry注解轻松使用Resilience4j的重试能力。
  同样,我们可以在application。properties中配置重试。resilience4j。retry。instances。retryDemo。maxattempts3resilience4j。retry。instances。retryDemo。waitduration1sresilience4j。retry。metrics。legacy。enabledtrueresilience4j。retry。metrics。enabledtrue
  1、maxattempts:最大尝试重试次数。
  2、waitduration:每次重试之间的间隔时间。
  更多的重试配置,请参考官网:https:resilience4j。readme。iodocsretry3。1演示效果
  访问:http:localhost:8080retry,重试后,进入后备方法fallback。
  指标
  actuatormetrics
  actuatormetrics{requiredMetricName}事件
  actuatorretries
  actuatorretryevents
  actuatorretryevents{name}
  actuatorretryevents{name}{eventType}4、隔板(Bulkhead)
  隔板来自造船行业,床仓内部一般会分成很多小隔舱,一旦一个隔舱漏水因为隔板的存在而不至于影响其它隔舱和整体船。
  隔板(Bulkhead)可以用来限制对于下游服务的最大并发数量的限制。
  我们在控制器中添加方法来演示隔板:GetMapping(bulkhead)Bulkhead(namebulkheadDemo)publicStringbulkhead(){returnrestTemplate。getForObject(https:reqres。inapiusers,String。class);}
  使用Bulkhead注解实现隔板功能,在application。properties中配置隔板:resilience4j。bulkhead。instances。bulkheadDemo。maxconcurrentcalls3resilience4j。bulkhead。instances。bulkheadDemo。maxwaitduration1resilience4j。bulkhead。metrics。enabledtrue
  1、maxconcurrentcalls:隔板允许的最大并发执行数量
  2、maxwaitduration:当试图进入一个饱和的隔板时,线程应被阻断的最大时间。
  Resilience4j的隔板支持两种类型:
  默认的Semaphore:使用用户请求的线程,而不创建新的线程。
  线程池:创建新的线程用来处理。配置如:resilience4j。threadpoolbulkhead。instances。bulkheadDemo。maxthreadpoolsize3resilience4j。threadpoolbulkhead。instances。bulkheadDemo。corethreadpoolsize2resilience4j。threadpoolbulkhead。instances。bulkheadDemo。queuecapacity1
  更多隔板的配置,参考官网:https:resilience4j。readme。iodocsbulkhead4。1异常处理
  当隔板饱和的时候会抛出BulkheadFullException异常,添加到Resilience4jExceptionHandler。ExceptionHandler({BulkheadFullException。class})ResponseStatus(HttpStatus。BANDWIDTHLIMITEXCEEDED)publicStringhandleBulkheadFullException(){return隔板已满;}4。2演示演示
  用ApiFox访问:http:localhost:8080bulkhead,并发设置为4,得到结果:
  我们看下失败请求的明细:
  指标
  actuatormetrics
  actuatormetrics{requiredMetricName}事件
  actuatorbulkheads
  actuatorbulkheadevents
  actuatorbulkheadevents{name}
  actuatorbulkheadevents{name}{eventType}5、限流器(RateLimiter)
  限流器用来限制访问下游服务的速度。控制器中添加演示方法:GetMapping(ratelimiter)RateLimiter(namerateLimitDemo)publicStringrateLimit(){returnrestTemplate。getForObject(https:reqres。inapiusers,String。class);}
  同样限流只需要使用注解RateLimiter即可。在application。properties添加配置:resilience4j。ratelimiter。instances。rateLimitDemo。limitforperiod5resilience4j。ratelimiter。instances。rateLimitDemo。limitrefreshperiod60sresilience4j。ratelimiter。instances。rateLimitDemo。timeoutduration0sresilience4j。ratelimiter。instances。rateLimitDemo。allowhealthindicatortofailtrueresilience4j。ratelimiter。instances。rateLimitDemo。subscribeforeventstrueresilience4j。ratelimiter。instances。rateLimitDemo。eventconsumerbuffersize50resilience4j。ratelimiter。metrics。enabledtrueresilience4j。ratelimiter。instances。rateLimitDemo。registerhealthindicatortrue
  上面的配置限制调用的限制是每60秒(limitrefreshperiod)的访问次数是5次(limitforperiod)。
  更多关于限流器的配置请参考官网:https:resilience4j。readme。iodocsratelimiter5。1异常处理
  当达到允许的速度的时候,请求将会被拒绝,程序抛出RequestNotPermitted异常。ExceptionHandler({RequestNotPermitted。class})ResponseStatus(HttpStatus。TOOMANYREQUESTS)publicStringhandleRequestNotPermitted(){return请求不被允许;}5。2效果效果
  访问:http:localhost:8080ratelimiter,在60秒内访问次数超过5次:
  健康
  actuatorhealth指标
  actuatormetrics
  actuatormetrics{requiredMetricName}事件
  actuatorratelimiters
  actuatorratelimiterevents
  actuatorratelimiterevents{name}
  actuatorratelimiterevents{name}{eventType}6、限时器(TimeLimiter)
  限时器用来限制在另外一个线程中执行的服务调用的时间。在控制器中新建方法,我们需要调用一个异步服务,即在另一个线程中执行的服务:RestControllerpublicclassResilience4jController{privatefinalRestTemplaterestTemplate;privatefinalAsyncServiceasyncService;publicResilience4jController(RestTemplateBuilderbuilder,AsyncServiceasyncService){this。restTemplatebuilder。build();this。asyncServiceasyncService;}GetMapping(timelimiter)TimeLimiter(nametimeLimiterDemo)publicCompletableFutureStringtimeLimiter(){returnasyncService。doSomething();}}
  通过TimeLimiter注解使用显示器功能,我们程序还需使用EnableAsync开启异步的支持:SpringBootApplicationEnableAsyncpublicclassResilience4jDemoApplication{publicstaticvoidmain(String〔〕args){SpringApplication。run(Resilience4jDemoApplication。class,args);}}
  异步服务:ServicepublicclassAsyncService{privatefinalRestTemplaterestTemplate;publicAsyncService(RestTemplateBuilderbuilder){this。restTemplatebuilder。build();}AsyncpublicCompletableFutureStringdoSomething(){try{Thread。sleep(3000);}catch(InterruptedExceptione){thrownewRuntimeException(e);}returnnewAsyncResultString(restTemplate。getForObject(https:reqres。inapiusers,String。class))。completable();}}
  在这个异步线程任务里,线程睡眠了3秒钟。
  我们在application。properties中对限时器进行配置:resilience4j。timelimiter。instances。timeLimiterDemo。timeoutduration2sresilience4j。timelimiter。instances。timeLimiterDemo。cancelrunningfuturetrueresilience4j。timelimiter。metrics。enabledtrue
  配置意味着当异步线程处理时间超过2s(timeoutduration)后将会限制访问。上面异步线程处理中线程睡了3秒,那请求必然超时。
  更多关于限时器的配置,请查看官网:https:resilience4j。readme。iodocstimeout6。1异常处理
  当异步处理线程超时后,将会抛出TimeoutException异常。ExceptionHandler({TimeoutException。class})ResponseStatus(HttpStatus。REQUESTTIMEOUT)publicStringhandleTimeoutException(){return访问超时;}6。2演示演示
  访问:http:localhost:8080timelimiter,提示访问超时。
  指标
  actuatormetrics
  actuatormetrics{requiredMetricName}事件
  actuatortimelimiters
  actuatortimelimiterevents
  actuatortimelimiterevents{name}
  actuatortimelimiterevents{name}{eventType}
  感谢对我的书《从企业级开发到云原生微服务:SpringBoot实战》的支持。
  转载请注明出处:今日头条:爱科学的卫斯理(此处已添加书籍卡片,请到今日头条客户端查看)

地球是怎么形成的?地球的起源仍然是一个难题。地球的形成仍然是一个奇怪的科学谜团。我们与其他七颗行星一起生活在太阳系中的一颗行星上,迄今为止已经发现了数千颗系外行星。但是像地球这样的行……隋唐英雄罗成英雄了得,其后代如何?隋唐时期,正值天下大乱,究其原因,一则是杨广欺娘戏妹、弑父鸩兄,得帝位不算是正道,所以引发众忠臣良将的不满。肆意诛杀忠臣任用奸佞。二则杨广年年出巡,曾三游扬州,两巡塞北,一游河……秦始皇陵墓的地宫中藏着什么?以现代技术挖掘至少需四百年?综述秦始皇,公元前259年出生,前247年继承王位,前221年统一六国,自此成为我们中国历史上第一位皇帝。时至今日,不少人在提到秦始皇之时,仍然心存敬畏。如果没有他……渤海抗日根据地抗日战争时期,党领导的敌后抗日武装在河北省东南部、山东省北部交界处创建了一个东临渤海、西枕津浦铁路,北至天津、南跨胶济铁路的敌后抗日根据地渤海区抗日根据地。渤海区战略地位十分重……针对千元出头的低端手机,究竟该如何选择,从受众人群说起看文章听音乐是种享受,想听什么留言告知(都是付费无损包)谈起低端二字,我们的脑海中不经意之间竟然浮现出的是从一个游戏叫英雄联盟,其中用户的对低端的看法,是什么看法呢?那就……26分惨败!2连败!广东队输得越惨,越证明杜锋是真的很伟大文篮郭先生CBA的常规赛继续进行,山西队大战广东队,最终,山西队以12599击败广东队。数据方面,广东队的易建联15分7篮板2助攻,杜润旺13分,胡明轩19分6篮板5助攻……怀念周总理的颂歌怀念周总理的颂歌文陈天林梅园新村的脚印至今还那么清晰那是伟人艰苦卓绝的写照卖报!卖报!这岂是普通的报童又是伟人为革命操劳西安事变……中国工业在世界上处于怎样的地位18世纪的英国作为率先完成工业革命的国家带领人类进入了蒸汽时代。从19世纪60年代起以电气化为标志的第二次工业革命徐徐拉开帷幕。第一次工业革命后英、法、美等国就已迈入工业化门槛……中国第一凶墓?80多个盗墓贼丧命于此,墓主人身份成谜第一凶墓都说盗墓是一个技术活,事实上,墓葬防盗对技术要求更高。2005年,在河南上蔡县郭庄村出土的一座2千年前的古墓,就曾凭借高超的防盗手段,让历朝历代为数众多的盗……女子贷款做面部整容,不料术后变歪嘴,要求全额退款并赔偿损失11月21日,在湖北武汉,一女子告诉记者,自己在某美容院做的面部整容手术完全失败了。据悉,武汉47岁的王女士在朋友的推荐下贷款5万元进行面部整容手术,没想到做了五个项目,……华为WatchGT3Pro将发布,首款支持自由潜水功能的手表再过几天就是华为的新品发布会了,华为此前就宣布在4月28日发布最新款的智慧屏VPro和MateXs2折叠屏手机,虽然官方没有透露出这两款新品的参数配置,但是在网上还是可以看见一……桂林市区周边油菜花开得正艳,带上这份地图赶紧出门赏花吧窑头村的花海中放着一顶轿子,吸引了众多游人。进入雨水节气,桂林春意越来越浓。刚刚过去的周末桂林天气晴好,适合郊游赏花。市区周边的油菜花在阳光的照耀下开得正艳,吸引了众多市……
乾隆举办千叟宴,老人们为何吃完饭回家不久就去世了?乾隆举办千叟宴,为何老人吃过饭后回家不久就去世了?在康熙皇帝68岁时,下令让全天下活到65岁的老人都来赴宴,也称为千叟宴。在当时,参加宴席的老人有几千位,从65岁到90之……皇帝羞辱宰相,将50岁乳母赐给他,宰相掀开盖头后为何直呼万岁说到唐朝这段历史,相信大家还是很熟悉的,还记得小时候看的电视剧《神探狄仁杰》,更算得上是大陆地区的悬疑破案类电视剧的鼻祖了。其实狄仁杰不仅仅有查案子的侦探这样一个作用,他……郭松民丨共和国往事小平同志与反右斗争今年是对新中国历史影响既深且巨的反右斗争60周年,也是邓小平同志逝世20周年。在主流的纪念文章中,全部都是在谈小平同志推动改革开放的成就,无人涉及小平同志参与、领导反右斗争的历……郭沫若为什么能成为中国科学院院院长?先说定论,郭沫若是一个非常伟大的共产党员!政治上他在我党最危难的时候火速入党,1927年,蒋介石发动四一二政变,残害共产党人,政变开始后,郭沫若写下《请看今日之蒋介石》一……60年代大寨的铁姑娘郭凤莲,名声曾妇孺皆知,现在过得如何?在许多人眼中,女子一直以柔弱示人,女子就好似一汪春水淡淡地泛着涟漪,娇柔的无缚鸡之力,所以,一些较为困难和吃力的活也就理所应当地成了男子应该做的,这才有了男性地位的逐渐提升,然……处于东西欧十字路口的塞尔维亚,军事能力有多强?学过历史都知道在二战后,欧洲产生的南斯拉夫,曾是欧洲最强大的国家之一,其国土广阔,人口众多,尤其是具有广阔的海岸线和庞大的军队,无论是陆军,海军还是空军,都是非常强悍的。但是在……云顶之弈克制敖兴的竟是一费卡!灵风大力出奇迹,打拳就是干前言:大家好,我是小嗨。今天给大家分享一套专门去打敖兴的阵容怒翼瑟提。阵容组成:瑟提、赛娜、洛、赫卡里姆、霞、杰斯、亚索、希瓦娜阵容羁绊:8怒翼1冒险2神龙2射手2……他不是一个好皇帝,但却是一个好人是谁在洗白朱祁镇?(大漠)正统十四年,公元1449年。关外,茫茫大漠,极尽风沙苦寒之地。一处十分破旧的蒙古包外,一个身着胡服,蓬头乱发的年轻人已经在地上跪了很长时间。他穿……清朝正黄旗人都有通天纹,通天纹是什么,为何古籍说通天纹开不得月蓬岩下电,相心不相面。相信许多人都听说过清朝正黄旗人的额头都有通天纹的说法。可通天纹有着怎样的意义,为什么非要和正黄旗联系在一起?其实史料记载通天纹其实是不……陕西女婿朱军童年是个苦孩子,性骚扰官司胜诉后婚姻怎样了?头条创作挑战赛点击关注,每天都有名人故事感动您!朱军与妻子谭梅朱军是家喻户晓的央视主持人,先后21次主持央视春晚,另外他还主持了《东西南北中》《中国音乐电视》……1952年聂荣臻前来告状,毛主席勃然大怒,当即命令中央展开调1952年初的某天,毛主席正在听取公安部长罗瑞卿关于三反运动的工作汇报。就在这个时候,聂荣臻突然闯了进来,张口就说:主席啊,我要向您告状!这句话一出,毛主席和罗瑞卿都愣在……毛泽东主席在韶山明媒正娶的第一位夫人罗大秀1936年7月,在延安,美国记者埃德加斯诺采访毛泽东主席,毛主席披露了自己的首次婚姻:我十四岁的时候,父母给我娶了一个二十岁的女子,可是我从来没有和她一起生活过后来也没有。我并……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网