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


至于前面說的配置文件變更通知的功能,我是基于客戶端來實現的 。
三、客戶端的實現客戶端工程代碼如下

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

文章插圖
1、ConfigFileChangedListener
擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
ConfigFileChangedListener
配置變動的監聽器 , 當客戶端對某個配置監聽的時候,如果這個配置的內容有變化的話 , 客戶端就會回調這個監聽器 , 傳入最新的配置
2、ConfigService
擼了一個簡易的配置中心,順帶整合到了SpringCloud

文章插圖
封裝了客戶端的核心功能,可以添加對某個文件的監聽器和獲取某個文件的配置內容 。
使用示例:
// 創建一個ConfigService,傳入配置中心服務端的地址ConfigService configService = new ConfigService("localhost:8888");// 從服務端獲取配置文件的內容,文件的id是新增配置文件時候自動生成ConfigFile config = configService.getConfig("69af6110-31e4-4cb4-8c03-8687cf012b77");// 對某個配置文件進行監聽configService.addListener("69af6110-31e4-4cb4-8c03-8687cf012b77", new ConfigFileChangedListener() {    @Override    public void onFileChanged(ConfigFile configFile) {        System.out.printf("fileId=%s配置文件有變動,最新內容為:%s%n", configFile.getFileId(), configFile.getContent());    }});這里說一下配置變更通知的實現原理 。
首先對于客戶端來說,要想知道哪個配置文件進行了改動,有兩種方式
第一種是通過push的方式來實現 。當配置文件發生變動的時候,服務端主動將變動的配置文件push給客戶端 。這種方式實現起來比較麻煩,一方面是服務端還得存儲客戶端的服務的信息 , 因為服務端得知道push到哪臺服務器上;另一方面,客戶端需要提供一個接口來接收服務端push的請求,所以這種方式整體實現起來比較麻煩 。但是這種push方式時實性比較好 , 一旦配置文件有變動,第一時間客戶端就能夠知道配置有變動 。
第二種方式就是基于pull模式來實現 。客戶端定時主動去服務端拉取配置文件,判斷文件內容是否有變動 , 一旦有變動就進行監聽器的回調 。這種實現相比push來說簡單不少,因為服務端不需要關心客戶端的信息,所有的操作都由客戶端來完成 。但是這個定時的時間間隔不好控制 , 太長可能會導致時實性差,太短會導致可能無效請求過多,因為配置壓根可能沒有變化 。
但是這里我選擇了第二種方式,因為實現起來簡單 。。

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

文章插圖
變動通知代碼實現
到這,一個簡單的配置中心的服務端的和客戶端就完成了,這里畫張圖來總結一下配置中心的核心原理 。

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

文章插圖
接下來就把這個簡易的配置中心整合到SpringCloud中 。
SpringCloud配置中心的原理1、項目啟動是如何從配置中心加載數據的?在SpringCloud環境下,當項目啟動的時候 , 在SpringBoot應用容器創建之前,會先創建一個容器,這個容器非常重要,這個容器是用來跟配置中心交互,拉取配置的 。
這個容器在啟動的時候會干兩件事:
  • 加載bootstrap配置文件,這就是為什么配置中心的配置信息需要寫在bootstrap配置文件的重要原因
  • 加載所有spring.factories文件中的鍵為org.springframework.cloud.bootstrap.BootstrapConfiguration對應的配置類 , 將這些配置類注入到這個容器中,注意這里是不會加載@EnbaleAutoConfiguration自動裝配的類
當這兩件事都做好之后,會從這個容器中獲取到所有的PropertySourceLocator這個接口的實現類對象 , 依次調用locate方法 。

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

文章插圖
PropertySourceLocator
這個類很重要 , 先來看看注釋
Strategy for locating (possibly remote) property sources for the Environment. Implementations should not fail unless they intend to prevent the application from starting.
扔到有道翻譯如下:
為環境定位(可能是遠程)屬性源的策略 。實現不應該失敗,除非它們打算阻止應用程序啟動 。

推薦閱讀