詳解spring cloud分布式關(guān)于熔斷器
spring cloud分布式中,熔斷器就是斷路器,其實都是一個意思。
為什么要使用熔斷器呢?
在分布式中,我們會根據(jù)業(yè)務(wù)或功能將項目拆分為多個服務(wù)單元,各個服務(wù)單元之間通過服務(wù)注冊和訂閱的方式相互依賴和調(diào)用功能,隨著項目和業(yè)務(wù)的不斷拓展,服務(wù)單元數(shù)量也逐漸增多,相互之間的依賴關(guān)系也越來越復(fù)雜,這時候,可能會某個服務(wù)單元出現(xiàn)問題或網(wǎng)絡(luò)原因依賴調(diào)用出錯或延遲,此時如果調(diào)用該依賴的請求不斷增加,那么要調(diào)用該服務(wù)的服務(wù)將都會等待或者出現(xiàn)故障,如果后續(xù)連鎖反應(yīng)越來越多,Servlet容器的線程資源會被消耗完畢,導(dǎo)致服務(wù)癱瘓。服務(wù)與服務(wù)的依賴會導(dǎo)致服務(wù)之間的故障傳播,從而迎來“雪崩效應(yīng)“。為了解決這種每個點或多個點的故障,就有了熔斷器的出現(xiàn)。
什么是熔斷器?
熔斷器就相當(dāng)于電路中的保險絲、保護(hù)器,它可以實現(xiàn)快速失敗,如果它在某一段時間里偵測到許多類似的錯誤,它將不再訪問遠(yuǎn)程服務(wù)器,會強迫以后的訪問都會快速失敗,從而防止某個服務(wù)不斷地嘗試執(zhí)行可能會失敗的操作,它會使服務(wù)繼續(xù)執(zhí)行而不用等待修正錯誤,或者浪費CPU時間去等到長時間的超時產(chǎn)生,從而進(jìn)入回路方法。熔斷器也可以使服務(wù)能夠診斷錯誤是否已經(jīng)修正,如果已經(jīng)修正,服務(wù)會再次嘗試調(diào)用操作。
1.在調(diào)用服務(wù)方加入熔斷器依賴jar包:
// https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix'
2.在Controller中:
@Controller //@EnableWebSecurity 安全檢查controller還要繼承extends WebSecurityConfigurerAdapter public class PageController { public static Logger logger=LoggerFactory.getLogger(PageController.class); @Autowired private RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "toIndex1")//斷路器進(jìn)入回路方法 @RequestMapping("/toIndex1") public String toIndex(Model model){ System.out.println("進(jìn)入toIndex"); logger.info("執(zhí)行調(diào)用"); String msg=restTemplate.getForEntity("http://project-solr/SolrSearch",String.class).getBody();//project-solr是調(diào)用注冊中心里的名字 logger.info("調(diào)用結(jié)束"); model.addAttribute("msg",msg); return "index"; } public String toIndex1(Model model){ System.out.println("進(jìn)入回路方法"); model.addAttribute("msg","服務(wù)不可用,請稍后重試"); return "index"; } }
注意:在調(diào)用方服務(wù)Controller中的方法上加上@HystrixCommand(fallbackMethod = "回路方法")
這里我讓回路方法調(diào)用的是toIndex1,要注意回路方法返回值,參數(shù)要與原方法一致
在被調(diào)用方的方法中制造故障:
3.在調(diào)用方的啟動類加注解@EnableCircuitBreaker啟動熔斷器
啟動:
可以看到進(jìn)入了回路方法
當(dāng)然還可以在調(diào)用方進(jìn)行配置:
hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 2000 #請求響應(yīng)時間 如果過了這個時間就會進(jìn)入回路方法 circuitBreaker: requestVolumeThreshold: 2 # 服務(wù)降級:此請求連續(xù)多少次響應(yīng)過慢或崩潰 系統(tǒng)就默認(rèn)把它當(dāng)成一個崩潰的方法 在一定時間內(nèi)調(diào)用此方法會直接進(jìn)入回路方法 這樣執(zhí)行更快 默認(rèn)值是20 請求該方法20次 如果崩潰或響應(yīng)過慢率大于百分之八十 就會默認(rèn)它是一個崩潰方法 #timeout: #enabled: false #取消超時檢查 無論線程運行多久 只要不崩潰就不進(jìn)入回路方法 一般情況不使用
配置完后運行:
運行好幾次發(fā)現(xiàn)它會前兩次會訪問并等待相應(yīng)結(jié)果,后面不再訪問就直接回應(yīng)結(jié)果進(jìn)入回路方法
當(dāng)然這是根據(jù)配置:
spring cloud熔斷器就說到這里,想了解spring cloud其他內(nèi)容,請瀏覽我以前博客
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
maven插件maven-jar-plugin構(gòu)建jar文件的詳細(xì)使用
maven-jar-plugin插件時maven中最常用的插件,也是maven構(gòu)建Java程序執(zhí)行包或者依賴包的默認(rèn)插件,本文主要介紹了maven插件maven-jar-plugin構(gòu)建jar文件的詳細(xì)使用,具有一定的參考價值,感興趣的可以了解一下2024-02-02Java中do-while循環(huán)的使用方法及注意事項詳解
這篇文章主要介紹了Java中do-while循環(huán)的使用方法及注意事項的相關(guān)資料,在Java編程中,do-while循環(huán)是一種基本的循環(huán)控制結(jié)構(gòu),它至少執(zhí)行一次循環(huán)體,然后根據(jù)條件判斷是否繼續(xù),文中將用法介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10關(guān)于Lists.partition集合分組使用以及注意事項
這篇文章主要介紹了關(guān)于Lists.partition集合分組使用以及注意事項,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Spring創(chuàng)建Bean的過程Debug的詳細(xì)流程
這篇文章主要介紹了Spring創(chuàng)建Bean的過程Debug的流程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Spring MVC項目中l(wèi)og4J和AOP使用詳解
項目日志記錄是項目開發(fā)、運營必不可少的內(nèi)容,有了它可以對系統(tǒng)有整體的把控,出現(xiàn)任何問題都有蹤跡可尋。下面這篇文章主要給大家介紹了關(guān)于Spring MVC項目中l(wèi)og4J和AOP使用的相關(guān)資料,需要的朋友可以參考下。2017-12-12Java利用iTextPDF庫實現(xiàn)制作PDF表格模板并填充數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何通過Java的iTextPDF庫制作一個PDF表格模板并填充數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2023-12-12