DUBBO配置引發的一個問題--- DUPLICATE SPRING BEAN ID
1.原因
因專案業務需要,要呼叫RPC框架,專案原本已經依賴了很多RPC介面需要啟動時載入,所以準備做成啟動時不預載入。 就是在配置的時候加上check=false.
官方文件解釋的作用,就是Dubbo 預設會在啟動時檢查依賴的服務是否可用,不可用時會丟擲異常,阻止 Spring 初始化完成,以便上線時,能及早發現問題,預設 check="true"
。
2. 好處
首先check的配置在立即載入的環境下可以來檢查是否有服務未初始化,設定為true,如容器初始化時有未初始化的服務被注入可丟擲異常讓應用初始化無法完成,設定為false則可以不影響應用的啟動,後續服務初始化完成後依然可以正常連上。也就是說check=false的配置本身可以解決迴圈依賴的問題。
懶載入是一種bean載入策略,並非和dubbo有直接的聯絡,也並非直接為了解決服務的迴圈依賴而存在,這種載入方式主要作用在於節約資源,提升效能,亦可以解決迴圈依賴的問題,只是如有載入了dubbo服務引用的bean要應用懶載入策略,需要check設為false來防止出現未完全裝配的bean影響應用的正常執行。
3.問題
我們平時想呼叫RPC介面只需要在我們的dubbo配置檔案中引入生產者的配置檔案在POM.XML中加上依賴。
但是這種配置檔案是我們直接引入不可以修改屬性,所以我們需要自己建立一個dubbo的配置檔案將自己需要的介面引入進來再加上這個屬性。
當我建立好檔案將專案啟動的時候,問題來了!
問題很明顯就是bean建立了兩次,從網上尋找答案,就是dubbo版本升級後重復載入Bean的時候不再是覆蓋,而是拋異常。繼而我從專案中去尋找此介面並沒有發現其他地方的引用,然後我就跟蹤檢視啟動資訊。
我預設掃描了spring資料夾下的所有配置檔案,包括這個我新建立用來修改dubbo介面配置的檔案。然後當我dubbo的檔案再次載入的時候就會遇到這個問題。
原因就是:新建立的配置檔案不要再放在啟動就掃描的resources預設資料夾下,新建立一個資料夾去放你所建立的檔案。
4.反思
遇到問題的時候要有思路的去解決,一定要檢視日誌,從這些可用的條件中去排查問題。
引用-----