spring cloud分布式中,熔斷器就是斷路器,其實(shí)都是一個(gè)意思。
為什么要使用熔斷器呢?
在分布式中,我們會(huì)根據(jù)業(yè)務(wù)或功能將項(xiàng)目拆分為多個(gè)服務(wù)單元,各個(gè)服務(wù)單元之間通過(guò)服務(wù)注冊(cè)和訂閱的方式相互依賴和調(diào)用功能,隨著項(xiàng)目和業(yè)務(wù)的不斷拓展,服務(wù)單元數(shù)量也逐漸增多,相互之間的依賴關(guān)系也越來(lái)越復(fù)雜,這時(shí)候,可能會(huì)某個(gè)服務(wù)單元出現(xiàn)問(wèn)題或網(wǎng)絡(luò)原因依賴調(diào)用出錯(cuò)或延遲,此時(shí)如果調(diào)用該依賴的請(qǐng)求不斷增加,那么要調(diào)用該服務(wù)的服務(wù)將都會(huì)等待或者出現(xiàn)故障,如果后續(xù)連鎖反應(yīng)越來(lái)越多,servlet容器的線程資源會(huì)被消耗完畢,導(dǎo)致服務(wù)癱瘓。服務(wù)與服務(wù)的依賴會(huì)導(dǎo)致服務(wù)之間的故障傳播,從而迎來(lái)“雪崩效應(yīng)“。為了解決這種每個(gè)點(diǎn)或多個(gè)點(diǎn)的故障,就有了熔斷器的出現(xiàn)。
什么是熔斷器?
熔斷器就相當(dāng)于電路中的保險(xiǎn)絲、保護(hù)器,它可以實(shí)現(xiàn)快速失敗,如果它在某一段時(shí)間里偵測(cè)到許多類似的錯(cuò)誤,它將不再訪問(wèn)遠(yuǎn)程服務(wù)器,會(huì)強(qiáng)迫以后的訪問(wèn)都會(huì)快速失敗,從而防止某個(gè)服務(wù)不斷地嘗試執(zhí)行可能會(huì)失敗的操作,它會(huì)使服務(wù)繼續(xù)執(zhí)行而不用等待修正錯(cuò)誤,或者浪費(fèi)cpu時(shí)間去等到長(zhǎng)時(shí)間的超時(shí)產(chǎn)生,從而進(jìn)入回路方法。熔斷器也可以使服務(wù)能夠診斷錯(cuò)誤是否已經(jīng)修正,如果已經(jīng)修正,服務(wù)會(huì)再次嘗試調(diào)用操作。
1.在調(diào)用服務(wù)方加入熔斷器依賴jar包:
1
2
|
// https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix compile group: 'org.springframework.cloud' , name: 'spring-cloud-starter-hystrix' |
2.在controller中:
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
|
@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)用注冊(cè)中心里的名字 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ù)不可用,請(qǐng)稍后重試" ); return "index" ; } } |
注意:在調(diào)用方服務(wù)controller中的方法上加上@hystrixcommand(fallbackmethod = "回路方法")
這里我讓回路方法調(diào)用的是toindex1,要注意回路方法返回值,參數(shù)要與原方法一致
在被調(diào)用方的方法中制造故障:
3.在調(diào)用方的啟動(dòng)類加注解@enablecircuitbreaker啟動(dòng)熔斷器
啟動(dòng):
可以看到進(jìn)入了回路方法
當(dāng)然還可以在調(diào)用方進(jìn)行配置:
1
2
3
4
5
6
7
8
9
10
11
|
hystrix: command: default : execution: isolation: thread: timeoutinmilliseconds: 2000 #請(qǐng)求響應(yīng)時(shí)間 如果過(guò)了這個(gè)時(shí)間就會(huì)進(jìn)入回路方法 circuitbreaker: requestvolumethreshold: 2 # 服務(wù)降級(jí):此請(qǐng)求連續(xù)多少次響應(yīng)過(guò)慢或崩潰 系統(tǒng)就默認(rèn)把它當(dāng)成一個(gè)崩潰的方法 在一定時(shí)間內(nèi)調(diào)用此方法會(huì)直接進(jìn)入回路方法 這樣執(zhí)行更快 默認(rèn)值是 20 請(qǐng)求該方法 20 次 如果崩潰或響應(yīng)過(guò)慢率大于百分之八十 就會(huì)默認(rèn)它是一個(gè)崩潰方法 #timeout: #enabled: false #取消超時(shí)檢查 無(wú)論線程運(yùn)行多久 只要不崩潰就不進(jìn)入回路方法 一般情況不使用 |
配置完后運(yùn)行:
運(yùn)行好幾次發(fā)現(xiàn)它會(huì)前兩次會(huì)訪問(wèn)并等待相應(yīng)結(jié)果,后面不再訪問(wèn)就直接回應(yīng)結(jié)果進(jìn)入回路方法
當(dāng)然這是根據(jù)配置:
spring cloud熔斷器就說(shuō)到這里,想了解spring cloud其他內(nèi)容,請(qǐng)瀏覽我以前博客
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/itgaofei/p/9436849.html