遷移的文檔:
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:
好,問題解決