擼了一個簡易的配置中心,順帶整合到了SpringCloud( 四 )

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
最終從配置中心獲取到的屬性會放在項目啟動時創建的 Environment 對象里面 。
3.2配置刷新源碼流程
擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
這個圖新增了對于加了@ConfigurationProperties數據綁定的對象原理的分析 。
整合SpringCloud和測試一、整合SpringCloud1、ConfigCenterProperties
擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
配置中心的配置信息 , 這里需要配置配置中心服務端的地址和使用的配置文件的id 。當然這部分信息需要寫在bootstrap配置文件中 , 前面也說過具體的原因 。
2、ConfigCenterPropertySourceLocator上面分析知道 , 項目啟動和刷新的時候,SpringCloud是通過PropertySourceLocator的實現從配置中心加載配置信息,所以這里就得實現一下

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
核心的邏輯就是根據所配置的文件的id,從配置中心拉取配置信息 , 然后解析配置 。
3、ConfigContextRefresher這個是用來注冊文件變動的監聽器,來刷新文件的信息的 。
因為上面提到,當配置發生變化的時候,需要發布一個RefreshEvent事件來觸發刷新配置的功能 。

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
核心的邏輯就是當項目啟動的時候 , 對所使用的配置文件進行注冊一個監聽器 , 監聽器的實現就是當發生配置改動的時候,就發布一個RefreshEvent事件 。
4、兩個配置類4.1 ConfigCenterBootstrapConfiguration
擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
配置了ConfigCenterPropertySourceLocator、ConfigCenterProperties、ConfigService
4.2 ConfigCenterAutoConfiguration
擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
配置了ConfigContextRefresher、ConfigCenterProperties、ConfigService
最后需要將兩個配置類在spring.factories配置一下 。
這里有個需要注意,前面說過,SpringCloud會創建新的容器來加載配置 , 而這個容器只會加載spring.factories文件中鍵為@BootstrapConfiguration注解的配置類,所以需要將ConfigCenterBootstrapConfiguration跟BootstrapConfiguration配對,因為ConfigCenterBootstrapConfiguration配置了ConfigCenterPropertySourceLocator 。

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
好了,到這里真的就完成了對SpringCloud整合了 。
二、測試1、新增一個配置文件啟動配置中心的server端,然后打開ApiPost,新增一個配置文件

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
新增文件類型為properties一個配置,內容為sanyou.username=sanyou鍵值對,當然可以寫很多鍵值對,我這里就寫了一個 , 新增成功之后,返回了文件的id:79765c73-c1ef-4ea2-ba77-5d27a64c4685
2、測試客戶端這里我為了方便,就把測試代碼跟客戶端寫在同一個服務了,正常情況肯定是把跟SpringCloud代碼打成一個依賴引到項目中 。
在bootstrap.yml文件中配置配置中心的相關信息

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
  • 配置中心服務端的地址是:localhost:8888
  • 使用的配置文件的id是剛才創建的:79765c73-c1ef-4ea2-ba77-5d27a64c4685
測試Controller

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
提供一個接口,注入上面提到的UserService
啟動項目 , 調用接口

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
從斷這里可以看出,實際注入的是一個UserService代理對象,并且最終找的是com.sanyou.configcenter.test.UserService@3a1e4fd3這個UserService對象
此時這次調用的返回值就是:sanyou

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
接下來測試一下自動刷新屬性的功能
現在修改一下配置中心的sanyou.username為sanyou666

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
靜靜等待5秒鐘 。。
此時控制臺打印出 Refresh keys changed: [sanyou.username],也就是sanyou.username屬性變了

擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖

推薦閱讀