dubbo的服務(wù)啟動(dòng)依賴(lài)檢查刚梭,指的是當(dāng)啟動(dòng)服務(wù)時(shí),如果存在不可用的依賴(lài)時(shí)票唆,直接拋出異常朴读,從而阻斷spring初始化完成,以便在上線(xiàn)時(shí)發(fā)現(xiàn)問(wèn)題走趋。
這種看似非常合理的檢查衅金,有時(shí)候卻會(huì)給系統(tǒng)帶來(lái)很大的困擾。比如A的consumer依賴(lài)了B的provider簿煌,同時(shí)B的consumer也依賴(lài)了A的provider氮唯,這是什么?這就叫循環(huán)依賴(lài)姨伟。如果依賴(lài)雙方均沒(méi)有啟動(dòng)著的實(shí)例(比如所有服務(wù)都掛了惩琉,等待重啟),那么就會(huì)導(dǎo)致A等待B啟動(dòng)后才能啟動(dòng)夺荒,反之亦然的死循環(huán)問(wèn)題瞒渠。
那么這個(gè)服務(wù)啟動(dòng)依賴(lài)檢查是靠什么控制的呢?
check=false or check=true
check屬性一般用在 dubbo:refrence 中技扼,標(biāo)記一個(gè)引用的接口是否在初始化時(shí)檢查是否可用伍玖。
例如:
<dubbo:reference id="testService"
interface="com.test.service.TestService"
registry="xxxRegistry"
version="1.0.0"
cluster="failover"
timeout="500"
check="false"/>
dubbo:reference==缺省使用的是dubbo:consumer==中的check配置,默認(rèn)為true剿吻,也就是說(shuō)在沒(méi)有顯示聲明一個(gè)接口的check=false私沮,那么默認(rèn)為true,也就是需要檢查和橙。
一般情況下仔燕,在測(cè)試環(huán)境中,我們都顯示的聲明
<dubbo:consumer check="false">
旨在關(guān)閉對(duì)于引用的dubbo服務(wù)的啟動(dòng)檢查配置魔招。
在生產(chǎn)環(huán)境晰搀,我們一般推薦手動(dòng)將各個(gè)無(wú)需檢查的reference進(jìn)行顯示聲明check=false處理,這樣可以讓開(kāi)發(fā)人員更加清晰自己的系統(tǒng)依賴(lài)情況办斑,除非強(qiáng)依賴(lài)外恕,否則不建議將該屬性置為true杆逗。
或者干脆學(xué)習(xí)測(cè)試環(huán)境的做法,將dubbo的默認(rèn)check設(shè)置為false鳞疲,reference中全部使用缺省配置罪郊,不依賴(lài)check來(lái)發(fā)現(xiàn)問(wèn)題,而是在運(yùn)行時(shí)發(fā)現(xiàn)也是十分可取的尚洽。
總結(jié):
- dubbo:reference中check的缺省值來(lái)源于dubbo:consumer中的check配置悔橄,默認(rèn)為true。
- 對(duì)于check配置腺毫,優(yōu)先級(jí) dubbo:reference > dubbo:consumer癣疟。
- dubbo:registry中也有check配置,默認(rèn)為true潮酒,當(dāng)它為true時(shí)睛挚,注冊(cè)中心不存在則立刻報(bào)錯(cuò),反之急黎,如果你是懶加載扎狱,注冊(cè)中心不存在也不應(yīng)該影響啟動(dòng),就可以設(shè)置為false勃教。和以上dubbo:reference中的配置不要混淆淤击。