服務平滑遷移:eureka遷移到nacos。無法註冊雙中心的問題解決

遷移的文檔:

https://www.alibabacloud.com/help/zh/edas/developer-reference/smoothly-migrate-a-spring-cloud-cluster-that-contains-multiple-applications-to-edas

其中遇到的問題

未配置排除配置項時(exclude = {RibbonEurekaAutoConfiguration.class}),ribbonServerList不是我需要的MigrationRibbonConfiguration.ribbonServerList 的bean。造成雙註冊中心失效。未配置成功。

使用此配置會造成依然是單註冊中心eureka。無法達到要求

如下圖:

 

 

 

回溯這個問題初始化ribbonServerList的bean時,有一個註解:

@ConditionalOnMissingBean 它是修飾bean的一個註解,主要實現的是,當你的bean被註冊之後,如果而註冊相同類型的bean,就不會成功,它會保證你的bean只有一個,即你的實例只有一個。

換句話是指: 這個bean誰先來用誰。這個方法均有註解:@ConditionalOnMissingBean

org.springframework.cloud.netflix.ribbon.eureka.EurekaRibbonClientConfiguration#ribbonServerList

com.alibaba.edas.ribbon.MigrationRibbonConfiguration#ribbonServerList

org.springframework.cloud.alibaba.nacos.ribbon.NacosRibbonClientConfiguration#ribbonServerList

那就看創建bean的時候:

 

 

發現bean的定義信息就不對了,不應該是eurekaRibbonClientConfiguration。應該是MigrationRibbonConfiguration纔對。

那就找mbd的生成位置

 

看:getBeanDefinition 方法

 

this.beanDefinitionMap 出現了問題,那就找這個map.put的位置:註冊bean的定義信息的方法:

 


bean的定義信息已經出現了問題

 


因爲eurekaRibbonClientConfiguration、migrationRibbonConfiguration、nacosRibbonClientConfiguration 是都有ribbonServerList的方法的,還有一個@ConditionalOnMissingBean的註解。需要將migrationRibbonConfiguration調到前面。

 


 


由於eurekaRibbonClientConfiguration進行優先加載,則ribbonServerList就使用eureka的了:

 


那麼

 

 

回來看入參:

 

,發現configCandidates屬性是add添加的,來自於: registry.getBeanDefinitionNames();

 

,確認registry是DefaultListableBeanFactory類,找對應的方法

 

,找到這list.add的地方:

 

,然後能找那個地方在循環調用:看堆棧信息:

 

,然後發現eureka跑到項目的主類的前面去了。然後再找configurations賦值的地方:

只有一個:

 

 

 

確定是list轉Map順序變了:

 

解決辦法:

1、改項目名稱(離譜法):

之前叫GatewayApplicant,現在叫DemoApplication

 

順序正確,看ribbonServerList:

 

2、排除RibbonEurekaAutoConfiguration自動配置

 

ribbonServerList:

 好,問題解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章