㈠ springboot 2.4.13 無法從nacos獲取配置,但是可以注冊到nacos
springboot 2.4.13,集成了nacos,啟動後,nacos注冊中心有服務,但是,發現,配置沒有生效。於是,開啟了一段源碼查找的過程。
首先,是pom引入的nacos配置
然後,application.yml添加nacos配置
啟動後,發現注冊中心有服務,但是,服務的配置不是從nacos配置中心獲取的,而是本地的。
查找一下nacos源碼,找到nacos配置自動注入那塊兒:
然後發現,是這個NacosPropertySourceLocator實現的配置導入的
查詢源碼,可以發現,相關的配置,是通過這個方法,載入的,這個方法是總入口。
於是,嘗試加斷點,查看配置信息,看看為什麼沒有導入配置。然而,程序根本就沒有進入這個方法裡面!!!
根據介面實現,可以發現NacosPropertySourceLocator 是PropertySourceLocator的實現類,這個方法的調用執行,不是nacos自己去做的,而是通過spring去做的。
spring cloud 通過BootstrapApplicationListener,以監聽器的方式,通過監聽springboot啟動過程中的事件,通過onApplicationEvent方法處理事件,導入spring cloud相關配置。
通過加斷點,可以發現,這里的方法bootstrapEnabled()返回值是false,直接就不執行後續的載入了。
因此,需要保證bootstrapEnabled返回值是true。
查看PropertyUtils源碼,可以發現,需要配置項 spring.cloud.bootstrap.enabled=true 並且存在 org.springframework.cloud.bootstrap.marker.Marker 類的時候,spring cloud 才會去載入spring cloud的配置。
因此,pom中需要添加marker所在的組件依賴:
此時,需要在 bootstrap.yml 中添加spring cloud配置:
(至於為什麼是bootstrap.yml而不是application.yml,這又是另一個問題了)
有了上面的配置,程序啟動後,就能正常的從nacos配置中心獲取配置了。
㈡ Spring Gateway 集成Nacos 實現動態路由配置
通過Spring Gateway 集成Nacos實現配置管理,並且實現動態路由管理。
一、創建test-gateway項目,POM文件如下:
二、創建項目配置文件bootstrap.yml
a、test_gateway_commons.yml內容如下:
三、創建網關配置類 GatewayConfig.java
四、創建動態路由服務DynamicRouteServiceImpl.java
五、創建通過Nacos讀取動態路由配置服務.java
六、配置動態路由配置文件gateway_dynamic_router,內容如下:
通過以上步驟就完成Spring Gateway 集成Nacos 實現動態路由配置功能。以後只要通過修改Nacos的配置文件就可以時間服務的動態上下線了。不需要再重啟網關了。