首頁>技術>

專案用的springboot,連帶著配置中心也一直用的spring的配置中心,但是一直以來都有各種問題:

1.每次變更配置要重啟配置中心和應用;

2.各個環境叢集的配置檔案在不同分支,每個環境要分別手動同步,容易遺漏;

3.無法確定當前應用是否重啟過,讀取的是最新配置。

當然,個人覺得最重要的就是需要重啟應用這個,簡直就是浪費時間,浪費時間就是浪費生命啊。雖然spring也提供@RefreshScope這個註解來動態更新配置,但是用起來不是很方便,而且不能對散落在程式碼各處的配置統一處理,對老程式碼也無能為力,頭大。

可能大家忍受夠了,運維推了一個apollo配置中心來替換spring的配置中心,主打配置實時同步,真是直擊程式設計師最深處心靈,皆大歡喜。正好以前也看過某位大神的分析,相比較他也是推薦apollo的,所以這邊馬上就紅紅火火的切換起來了。

過程

導client的jar包,做一些基本的配置,線上環境的啟動引數運維會處理,這邊方便本地啟動會在配置檔案中加一些配置:

專案resource 目錄下增加 META-INF/app.properties 檔案,檔案中增加如下內容

app.id=web-admin# 這裡填上用於本地,線上運維會覆蓋apollo.meta=http://172.16.101.11:8080 # 配置的本地快取目錄,這行也可不配置,不配Apollo有預設值target/classes/config-cacheapollo.cacheDir=/opt/data/apollo-config

專案 resource 目錄下增加 application.properties 檔案, 檔案中增加

apollo.bootstrap.enabled=trueapollo.bootstrap.namespaces=application,dev.common

"application", "dev.common" 為 應用配置 的namespace ,namespace相關概念移步官方文件,一個namespace相當於一個配置檔案。

一切看上去都很順利,為了驗證配置是否實時更新推送,還寫了一個監聽器,把變化的配置打印出來,大致長這模樣

登入apollo的炫酷管理頁面,配置一改一發布,果然日誌就啪啪啪打出來了,所以大功告成?還好留了個心眼,這裡只是列印了變更事件裡面的屬性呀,實際的配置值變沒變呢?搞了@Value註解的配置,然後變更前後的值都列印了一下,沒問題,之前123,現在1234了,變得還挺快。但是測試@ConfigurationProperties註解的配置類的時候就發現問題了,怎麼測都不變,配置變更事件是觸發的,檢視本地快取也是變了,但是記憶體中的配置類物件的屬性一直不變。網上是在找不到,只好看官方文件,果然發現了坑。。。附官方原話

需要注意的是,@ConfigurationProperties如果需要在Apollo配置變化時自動更新注入的值,需要配合使用EnvironmentChangeEvent或RefreshScope。相關程式碼實現,可以參考apollo-use-cases專案中的ZuulPropertiesRefresher.java和apollo-demo專案中的SampleRedisConfig.java以及SpringBootApolloRefreshConfig.java

也就是說,預設情況下@ConfigurationProperties註解標註的配置類是不會實時更新的,f**k,這不是坑麼,最看重的功能預設不開啟。照著官方文件寫,結果發現第二種連配置都讀不到了,就是@RefreshScope和@ConfigurationProperties一起用的時候會有問題,用的springboot的版本是1.3.2-RELEASE,不知道是不是版本太低的原因,最後用了第一種,還好最後成功了。

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 深入理解HashMap(文末附帶原始碼)