分布式下實(shí)現(xiàn)配置管理方式
隨著業(yè)務(wù)的發(fā)展,應(yīng)用系統(tǒng)中的配置會(huì)越來越多,配置之間也有不同的業(yè)務(wù)特點(diǎn),比如業(yè)務(wù)依賴的數(shù)據(jù)庫配置、緩存信息配置、索引存儲(chǔ)配置等。這類配置一般比較穩(wěn)定,不會(huì)頻繁更改,通常會(huì)放在工程中作為配置文件隨應(yīng)用一起發(fā)布。
除了這些配置,還有一部分配置會(huì)經(jīng)常發(fā)生修改,比如限流降級(jí)開關(guān)配置、業(yè)務(wù)中的白名單配置等。這些配置項(xiàng)除了變更頻繁,還要求實(shí)時(shí)性,如果采取和應(yīng)用一起發(fā)布的方式,那么每次變更都要重新發(fā)布服務(wù),非常不方便。
為了解決這類配置問題,出現(xiàn)了分布式配置管理平臺(tái),這一課時(shí)我們就來了解一下分布式配置管理相關(guān)的內(nèi)容。
一、配置管理的應(yīng)用場(chǎng)景
在項(xiàng)目開發(fā)中,數(shù)據(jù)庫信息等配置管理,一般是隨著工程一起上線的,比如 Java 的 Web 系統(tǒng),習(xí)慣把數(shù)據(jù)庫的配置信息放到 jdbc.properties 這個(gè)配置文件中。
在分布式場(chǎng)景下,配置管理的應(yīng)用范圍更加廣泛。比如上面說的限流和降級(jí)配置,電商網(wǎng)站在舉行大型促銷活動(dòng)時(shí),由于訪問人數(shù)暴增,為了保證核心交易鏈路的穩(wěn)定性,會(huì)把一些不太重要的業(yè)務(wù)做降級(jí)處理,那么如何關(guān)閉非核心服務(wù)呢?就需要分布式配置管理系統(tǒng),能夠?qū)崟r(shí)管理被降級(jí)的業(yè)務(wù),保證系統(tǒng)安全。
在一些異步業(yè)務(wù)場(chǎng)景中,配置管理也廣泛應(yīng)用,比如工作中經(jīng)常會(huì)有數(shù)據(jù)同步,需要控制同步的速度;在一些定時(shí)任務(wù)中,需要控制定時(shí)任務(wù)觸發(fā)的時(shí)機(jī),以及執(zhí)行的時(shí)長等,這些都可以通過配置管理來實(shí)現(xiàn)。
二、配置管理如何實(shí)現(xiàn)
分布式配置管理的本質(zhì)就是一種推送-訂閱模式的運(yùn)用。配置的應(yīng)用方是訂閱者,配置管理服務(wù)則是推送方,客戶端發(fā)布數(shù)據(jù)到配置中心,配置中心把配置數(shù)據(jù)推送到訂閱者。
配置管理服務(wù)往往會(huì)封裝一個(gè)客戶端,應(yīng)用方則是基于該客戶端與配置管理服務(wù)進(jìn)行交互。在實(shí)際實(shí)現(xiàn)時(shí),客戶端可以主動(dòng)拉取數(shù)據(jù),也可以基于事件通知實(shí)現(xiàn)。
實(shí)現(xiàn)配置管理中心,一般需要下面幾個(gè)步驟:
- 提取配置信息,放到一個(gè)公共的地方存儲(chǔ),比如文件系統(tǒng)、數(shù)據(jù)庫、Redis;
- 使用發(fā)布/訂閱模式,讓子系統(tǒng)訂閱這些配置信息;
- 對(duì)外開放可視化的配置管理中心,對(duì)配置信息進(jìn)行操作維護(hù)。
三、分布式配置管理的特性要求
一個(gè)合格的分布式配置管理系統(tǒng),除了配置發(fā)布和推送,還需要滿足以下的特性:
- 高可用性,服務(wù)器集群應(yīng)該無單點(diǎn)故障,只要集群中還有存活的節(jié)點(diǎn),就能提供服務(wù);
- 容錯(cuò)性,保證在配置平臺(tái)不可用時(shí),也不影響客戶端的正常運(yùn)行;
- 高性能,對(duì)于配置平臺(tái),應(yīng)該是盡可能低的性能開銷,不能因?yàn)楂@取配置給應(yīng)用帶來不可接受的性能損耗;
- 可靠存儲(chǔ),包括數(shù)據(jù)的備份容災(zāi),一致性等,盡可能保證不丟失配置數(shù)據(jù);
- 實(shí)時(shí)生效,對(duì)于配置的變更,客戶端應(yīng)用能夠及時(shí)感知。
可以看到,一個(gè)好的配置管理系統(tǒng),不只是提供配置發(fā)布和推送就可以,還有許多高級(jí)特性的要求。
四、分布式配置中心選型
分布式配置管理系統(tǒng)可以選擇自研,也可以選擇開源組件,比如攜程開源的 Apollo、淘寶的 Diamond、百度的 Disconf 等。
1、Diamond
淘寶的 Diamond 是國內(nèi)比較早的配置管理組件,設(shè)計(jì)簡單,配置信息會(huì)持久化到 MySQL 數(shù)據(jù)庫和本地磁盤中,通過數(shù)據(jù)庫加本地文件的方式來進(jìn)行容災(zāi)。
客戶端和服務(wù)端通過 Http 請(qǐng)求來交互,通過比較數(shù)據(jù)的 MD5 值感知數(shù)據(jù)變化。在運(yùn)行中,客戶端會(huì)定時(shí)檢查配置是否發(fā)生變化,每次檢查時(shí),客戶端將 MD5 傳給服務(wù)端,服務(wù)端會(huì)比較傳來的 MD5 和自身內(nèi)存中的 MD5 是否相同。如果相同,則說明數(shù)據(jù)沒變,返回一個(gè)標(biāo)示數(shù)據(jù)不變的字符串給客戶端;如果不同,則說明數(shù)據(jù)發(fā)生變更,返回變化數(shù)據(jù)的相關(guān)信息給客戶端,客戶端會(huì)重新請(qǐng)求更新后的配置文件。
Diamond 開源版本已經(jīng)很久沒有更新了,比較適合小型的業(yè)務(wù)系統(tǒng)的配置管理,源碼規(guī)模也比較小,可以下載對(duì)應(yīng)的源碼來查看,下載地址為:github-diamond。
2、Disconf
Disconf 是百度的一款分布式配置管理平臺(tái),代碼倉庫地址為:knightliao-disconf。
Disconf 的實(shí)現(xiàn)是基于 ZooKeeper 的,應(yīng)用安裝需要依賴 ZooKeeper 環(huán)境,配置動(dòng)態(tài)更新借助 ZooKeeper 的 watch 機(jī)制實(shí)現(xiàn)。在初始化流程會(huì)中會(huì)對(duì)配置文件注冊(cè) watch,這樣當(dāng)配置文件更新時(shí),ZooKeeper 會(huì)通知到客戶端,然后客戶端再從 Disconf 服務(wù)端中獲取最新的配置并更新到本地,這樣就完成了配置動(dòng)態(tài)更新。
關(guān)于 Disconf 的細(xì)節(jié),可以查看作者提供的設(shè)計(jì)文檔:https://disconf.readthedocs.io/zh_CN/latest/design/index.html。
3、Apollo
Apollo 是攜程開源的分布式配置中心,官方的描述是:Apollo 能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置。配置修改后能夠?qū)崟r(shí)推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場(chǎng)景。
Apollo 服務(wù)端基于 Spring Boot 和 Spring Cloud 開發(fā),打包后可以直接運(yùn)行,不需要額外安裝 Tomcat 等應(yīng)用容器。Apollo 支持多種語言的客戶端,包括 Java 和 .Net 客戶端,客戶端運(yùn)行不需要依賴其他框架,對(duì)系統(tǒng)侵入較小。
相比 Diamond 和 Disconf,Apollo 一直保持著穩(wěn)定的版本更新,開源社區(qū)也比較活躍,管理界面友好,適合大型的業(yè)務(wù)系統(tǒng),比較推薦使用。可以在 Apollo的代碼倉庫 ctripcorp-apollo 中了解更多的信息。
除了以上幾款組件,大家熟悉的 ZooKeeper 也經(jīng)常被用作分布式配置管理,和 Disconf 的實(shí)現(xiàn)類似,是依賴 ZooKeeper 的發(fā)布訂閱功能,基于 watch 機(jī)制實(shí)現(xiàn)。
內(nèi)容中介紹的配置管理選型都是單獨(dú)提供配置管理功能的,其實(shí)在大部分業(yè)務(wù)系統(tǒng)中,配置管理都不是一個(gè)單獨(dú)的功能,一般是和服務(wù)治理,或者網(wǎng)關(guān)集成在一起。比如 Spring Cloud Nacos,除了支持服務(wù)發(fā)現(xiàn),還提供了配置管理的功能,Dubbo 的控制臺(tái) Dubbo Admin 也內(nèi)置了服務(wù)配置推送的功能。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java調(diào)用ffmpeg實(shí)現(xiàn)轉(zhuǎn)換視頻
這篇文章主要為大家詳細(xì)介紹了java調(diào)用ffmpeg實(shí)現(xiàn)轉(zhuǎn)換視頻功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Mybatis-Plus更新數(shù)據(jù)忽略null值問題
本文主要介紹了Mybatis-Plus更新數(shù)據(jù)忽略null值問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
SpringBoot和Vue.js項(xiàng)目中實(shí)現(xiàn)文件壓縮下載功能的具體方案
在Spring Boot和Vue.js項(xiàng)目中實(shí)現(xiàn)文件壓縮下載功能,主要思路是后端負(fù)責(zé)將多個(gè)文件壓縮成ZIP包,前端負(fù)責(zé)觸發(fā)下載并處理文件流,以下是具體的實(shí)現(xiàn)方案,需要的朋友可以參考下2025-09-09
IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在
這篇文章主要介紹了IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java嵌套for循環(huán)的幾種常見優(yōu)化方案
這篇文章主要給大家介紹了關(guān)于Java嵌套for循環(huán)的幾種常見優(yōu)化,在Java中優(yōu)化嵌套for循環(huán)可以通過以下幾種方式來提高性能和效率,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
在SpringBoot項(xiàng)目中如何實(shí)現(xiàn)線程池的動(dòng)態(tài)監(jiān)控
Spring Boot因其簡便、高效的特點(diǎn)廣受開發(fā)者喜愛,在復(fù)雜的業(yè)務(wù)場(chǎng)景下,如何確保Spring Boot應(yīng)用的高性能和穩(wěn)定性成為了一個(gè)關(guān)鍵問題,其中,線程池的管理策略直接影響到系統(tǒng)的吞吐量和資源利用效率,本文將重點(diǎn)探討在Spring Boot項(xiàng)目中,如何實(shí)現(xiàn)線程池的動(dòng)態(tài)監(jiān)控2023-10-10
java學(xué)習(xí)筆記之eclipse+tomcat 配置
俗話說:工欲善其事必先利其器,既然要學(xué)習(xí)java,首先把java的開發(fā)環(huán)境搗鼓一下吧,這里我們來談?wù)別clipse+tomcat的配置方法。2014-11-11

