SpringBoot熔斷機(jī)制之CircuitBreaker詳解
Circuit Breaker
熔斷機(jī)制在微服務(wù)中必不可少,比如故障發(fā)生時(shí)怎么處理
熔斷:半熔斷、熔斷打開、熔斷關(guān)閉
- 熔斷關(guān)閉: 熔斷關(guān)閉不會(huì)對(duì)服務(wù)進(jìn)行熔斷,當(dāng)請(qǐng)求服務(wù)失敗次數(shù)符合設(shè)定的規(guī)則則進(jìn)入熔斷機(jī)制
- 半熔斷: 部分請(qǐng)求根據(jù)規(guī)則調(diào)用當(dāng)前服務(wù),如果請(qǐng)求成功且符合規(guī)則則認(rèn)為當(dāng)前服務(wù)恢復(fù)正常,關(guān)閉熔斷;
- 熔斷打開:請(qǐng)求不再進(jìn)行調(diào)用當(dāng)前服務(wù),內(nèi)部設(shè)置時(shí)鐘一般為(MTTR:平均故障處理時(shí)間),當(dāng)打開時(shí)長達(dá)到所設(shè)時(shí)鐘則進(jìn)入半熔斷狀態(tài)。
- 基于服務(wù)策略觸發(fā)
服務(wù)降級(jí)
提到熔斷機(jī)制還得提下服務(wù)降級(jí)服務(wù)降級(jí)往往因?yàn)榉?wù)壓力過大,比如京東雙促之類的服務(wù)降級(jí)方式比較多
簡單舉個(gè)列子:在各大電商大促銷的時(shí)候往往詳情頁有時(shí)候是不會(huì)看到推薦之類的信息。
熔斷與服務(wù)降級(jí)關(guān)系
- 都是為實(shí)現(xiàn)服務(wù)高可用
- 最終的表現(xiàn)方式類似
基于Feign實(shí)現(xiàn)
- Feign 本身支持Hystrix,不再需要引入相關(guān)的jar
- Feign實(shí)現(xiàn)只支持類的方式,不支持方法
- 如果啟用 Hytrix則設(shè)置 enabled = true
feign: hystrix: enabled: true
基于上次寫的FeignServer module來測(cè)試此功能
fallback
簡單的fallback應(yīng)用,在FeignClient中加入 fallback
@FeignClient(value = "ribbonserver" , fallback = FeignServerImpl.class ) public interface FeignServer { @RequestMapping(value ="/testRealRibbon",method= RequestMethod.GET) String testRealRibbon(@RequestParam("content") String content); }
創(chuàng)建 FeignServerImpl 實(shí)現(xiàn)類,實(shí)現(xiàn)FeignClient的 FeignServer
@Component public class FeignServerImpl implements FeignServer { public String testRealRibbon(@RequestParam("content") String content) { return content + ", it's fallback with feign"; } }
測(cè)試驗(yàn)證
- 啟動(dòng) discovery 、configserver、apigateway、feignserver
- 因?yàn)閒eign調(diào)用的是ribbonserver的服務(wù),所以ribbonserver不用啟動(dòng)
測(cè)試結(jié)果為: Hello World, it’s fallback with feign
啟動(dòng)ribbonserver
測(cè)試結(jié)果為: Hello World, for Spring Boot
fallbackFactory
如果需要觸發(fā)來進(jìn)行熔斷,則需要用 fallbackFactory
在FeignClient中加入 fallbackFactory
@FeignClient(value = "ribbonserver" , fallbackFactory = FeignServerFactoryImpl.class ) public interface FeignServer { @RequestMapping(value ="/testRealRibbon",method= RequestMethod.GET) String testRealRibbon(@RequestParam("content") String content); }
創(chuàng)建 FeignServerFactoryImpl 實(shí)現(xiàn)類,實(shí)現(xiàn)FeignClient的 FeignServer
@Component public class FeignServerFactoryImpl implements FallbackFactory<FeignServer> { /** * Returns an instance of the fallback appropriate for the given cause * * @param cause corresponds to {@link AbstractCommand#getFailedExecutionException()} * often, but not always an instance of {@link FeignException}. */ public FeignServer create(Throwable cause) { return new FeignServer() { public String testRealRibbon(String content) { return content + ", it's fallback Factory with feign"; } }; } }
測(cè)試驗(yàn)證
- 啟動(dòng) discovery 、configserver、apigateway、feignserver
- 因?yàn)閒eign調(diào)用的是ribbonserver的服務(wù),所以ribbonserver不用啟動(dòng)
測(cè)試結(jié)果為: Hello World, it’s fallback Factory with feign
啟動(dòng)ribbonserver
測(cè)試結(jié)果為: Hello World, for Spring Boot
基于Ribbon實(shí)現(xiàn)
- 大致與Feign差不多,但需要引入 Hystrix,spring-cloud-starter-hystrix
- Feign 因?yàn)楸旧碇С?hystrix,所以不需要引入
- @HystrixCommand 指定 fallback的方法
@Controller public class RibbonController { @Autowired RestTemplate restTemplate; private final static String serverURI = "http://ribbonserver/"; @RequestMapping("/test") @HystrixCommand(fallbackMethod = "testError") public String testRibbon(String content) { System.out.println(content); restTemplate.getForEntity(serverURI+"testRealRibbon?content="+content,String.class); return "index"; } public String testError() { return "404"; } }
到此這篇關(guān)于SpringBoot熔斷機(jī)制之CircuitBreaker詳解的文章就介紹到這了,更多相關(guān)SpringBoot熔斷機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合WxJava開啟消息推送的實(shí)現(xiàn)
本文主要介紹了SpringBoot整合WxJava開啟消息推送,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03spring boot實(shí)現(xiàn)驗(yàn)證碼功能
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這篇文章主要介紹了spring boot實(shí)現(xiàn)驗(yàn)證碼功能,需要的朋友可以參考下2018-04-04Java設(shè)計(jì)模式之迭代模式(Iterator模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之迭代模式(Iterator模式)介紹,本文用一個(gè)老師點(diǎn)名的現(xiàn)象描述了迭代模式的使用,需要的朋友可以參考下2015-03-03詳解Java弱引用(WeakReference)的理解與使用
這篇文章主要介紹了Java弱引用(WeakReference)的理解與使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04