DPP_0001.jpg
微服務(wù)化之后,應(yīng)用的數(shù)量劇增,零時(shí)需要調(diào)整配置參數(shù)時(shí),無論是運(yùn)維直接在服務(wù)器上修改還是工程中修改配置后重新打包部署,對運(yùn)維來說工作量是巨大的,而且人為的操作會(huì)加大出錯(cuò)的幾率,那么外化和中心化配置可以更好的解決分布式環(huán)境的配置問題。Spring Cloud提供了2種方式的外化配置:
- Spring Cloud Config 通過本地文件系統(tǒng),git/svn倉庫來管理配置文件,可以滿足基本外化需求,但不能精細(xì)的管理配置項(xiàng)。
- Spring Cloud Zookeeper Config 通過Zookeeper分級(jí)命名空間來儲(chǔ)存配置項(xiàng)數(shù)據(jù),并且支持基礎(chǔ)上下文和profile命名空間,另外Zookeeper可以實(shí)時(shí)監(jiān)聽節(jié)點(diǎn)變化和通知機(jī)制,應(yīng)該是首選。
Spring Cloud Zookeeper Config提供的功能:
- 和Spring Boot無縫集成,能完全無縫替代properties或yml文件的配置。
- 支持默認(rèn)上下文命名空間。
- 支持profile命名空間。
- 支持應(yīng)用名稱命名空間。
- 命名空間上支持配置的繼承。
- 支持更改實(shí)時(shí)通知和endpoint
/refresh
被動(dòng)刷新,該特性不太好用。
Spring Cloud Zookeeper Config 基本能滿足要求了,但其實(shí)時(shí)通知機(jī)制會(huì)造成應(yīng)用暫停體驗(yàn)不好,需要初始化操作的配置(比如數(shù)據(jù)庫連接池,http連接池等)實(shí)時(shí)更新的意義不大。需要實(shí)時(shí)更新的是那些在運(yùn)行時(shí)從配置緩存中實(shí)時(shí)獲取的參數(shù),因此在此基礎(chǔ)上增加基于Spring Cloud Zookeeper Config和CuratorFramework的實(shí)時(shí)通知組件,基本設(shè)計(jì)思路是這樣的:
- 每一個(gè)需要?jiǎng)討B(tài)更新的節(jié)點(diǎn)下增加push_status節(jié)點(diǎn),任意值。
- 監(jiān)聽push_status節(jié)點(diǎn)的值變事件(NodeDataChanged)。
- 當(dāng)修改push_status節(jié)點(diǎn)值時(shí),會(huì)通知所有監(jiān)聽該節(jié)點(diǎn)的應(yīng)用端。
- 應(yīng)用端收到NodeDataChanged事件,遞歸獲取push_status節(jié)點(diǎn)下所有的節(jié)點(diǎn)數(shù)據(jù),并更新配置緩存。