作者:個推應(yīng)用平臺基礎(chǔ)架構(gòu)高級研發(fā)工程師 阿飛
在微服務(wù)架構(gòu)體系中,由于微服務(wù)眾多,服務(wù)之間又有互相調(diào)用關(guān)系,因此,一個通用的分布式配置管理是必不可少的。一般來說,配置管理需要解決配置集中管理、在系統(tǒng)運(yùn)行期間可實現(xiàn)動態(tài)配置、配置修改后支持自動刷新等問題。
在大多數(shù)微服務(wù)體系中,都會有一個名為配置文件的功能模塊來提供統(tǒng)一的分布式配置管理。構(gòu)建配置中心,統(tǒng)一對應(yīng)用中各個微服務(wù)進(jìn)行管理,對微服務(wù)體系的意義重大。
Consul作為輕量級的分布式K/V存儲系統(tǒng),搭建方便,可用性高,并且支持多數(shù)據(jù)中心,提供Web UI進(jìn)行K/V管理。此外Consul還可以結(jié)合Consul-Template或者在代碼中引入Consul Client的相關(guān)依賴創(chuàng)建Watcher來實時Watch K/V的變化,是配置管理的不二之選。
下圖為個推微服務(wù)體系基于Consul配置管理的整體設(shè)計。其中,CCenter就是在Consul的基礎(chǔ)上進(jìn)行二次開發(fā)的配置中心。
在實踐中,不同產(chǎn)品線的配置會放置在Consul的不同路徑下,實現(xiàn)不同產(chǎn)品線配置之間的隔離。
按照配置的用途,可將同一產(chǎn)品線下的配置分為三類:
1.API網(wǎng)關(guān)相關(guān)配置;
2.服務(wù)注冊與發(fā)現(xiàn)相關(guān)配置;
3.應(yīng)用相關(guān)配置。
其中,每類配置會對應(yīng)Consul上的不同目錄。
按照配置的變化特性,可將配置分為兩類:
1.環(huán)境相關(guān)的全局配置
如MySQL等外部依賴相關(guān)的配置和其他與環(huán)境相關(guān)的配置,這類配置在開發(fā)測試生產(chǎn)環(huán)境中存在差異,需要為不同環(huán)境配置不同的值。
2.應(yīng)用本身的配置
一般為不經(jīng)常性發(fā)生變化、可動態(tài)調(diào)整、開關(guān)的配置。這類配置比較穩(wěn)定,在初始化后,只有在需要時才會改動,通常會設(shè)置默認(rèn)值。這兩類配置在Consul上會放在不同的子目錄下。這樣QA、運(yùn)維只需要關(guān)注環(huán)境差異部分即可。
基于以上對配置的分類,最終Consul上的Key的格式如下:
/ProductLine_Prefix/Usage_Prefix/Environmental_Correlation_Prefix/Config_Item_Path
其中,
ProductLine_Prefix:用來隔離不同產(chǎn)品線的配置;
Usage_Prefix:用來區(qū)分配置的用途;
Environmental_Correlation_Prefix:用來分隔與環(huán)境相關(guān)的配置;
Config_Item_Path:具體的配置項。
1.以配置文件的形式組織,Consul上的一個K/V,對應(yīng)一個配置文件,如nginx的配置文件。
2.以配置項的形式組織,將配置文件模板化,拆成一個個的配置項,每個配置項對應(yīng)Consul上的一個K/V,多個配置項對應(yīng)一個配置文件。大部分配置文件本身都是以K/V的形式組織的,均適合模板化,模板化后即可以按照配置項的特性,在Consul上分成不同的類別進(jìn)行管理。
Consul上的K/V,要如何生成可加載的應(yīng)用,或可使用的配置呢?
1.用Node和Lua實現(xiàn)的微服務(wù)的配置更新,使用Consul-Template來實現(xiàn);
2.用Java實現(xiàn)的微服務(wù)的配置更新,通過Consul-Template工具(需要重啟應(yīng)用)和在代碼中引入Consul Client的依賴創(chuàng)建Watcher(熱更新)這兩種方式來實現(xiàn)。
Consul-Template是一個后臺進(jìn)程,它可以根據(jù)Watch Consul上K/V的變化,更新任意數(shù)量的模板,同時生成對應(yīng)的文件,之后還可以運(yùn)行任意的命令。要使用Consul-Template一般需要定義兩個文件:
1.模板文件
模板文件一般按照Go Template的格式進(jìn)行編寫,示例如下:
config-tree.ctmpl:
{{ tree /consul/path/to/configFiles | explode | toJSONPretty }}
該模板在/consul/path/to/configFiles路徑下的配置發(fā)生變化時,會渲染出一個Json格式的字符串,其中包含了/consul/path/to/configFiles下所有的K/V.
config-kv.ctmpl:
return {
host='{{ printf "%s/mysql/host" (env "CONSUL_CONFIG_PREFIX") | key }}',
port={{ keyOrDefault (printf "%s/mysql/port" (env "CON-SUL_CONFIG_PREFIX")) "3306" }},
user='{{ printf "%s/mysql/user" (env "CONSUL_CONFIG_PREFIX") | key }}',
password='{{ printf "%s/mysql/password" (env "CON-SUL_CONFIG_PREFIX") | key }}'
}
該模板是按照配置項來渲染的,在該模板中使用了Consul-Template定義兩個方法key和keyOrDefault。其中,key會在Consul上對應(yīng)的K/V創(chuàng)建后,再進(jìn)行渲染模板;keyOrDefault則會在Consul上沒有對應(yīng)的K/V時,使用默認(rèn)值代替。
模板中還使用了 " CONSUL_CONFIG_PREFIX " 這個環(huán)境變量,這樣,不同的產(chǎn)品線便可以使用同一個模板文件,只需要修改" CONSUL_CONFIG_PREFIX "這個環(huán)境變量的值即可。
2.配置文件
配置文件是按照HashiCorp Configuration Language (HCL)編寫的,示例如下:
template {
source = "config-tree.ctmpl",
destination = "config-tree.json",
command = "sh updateAndReload.sh config-tree.json”
}
template {
source = "config-kv.ctmpl",
destination = "config-kv.lua",
command = "sh updateAndReload.sh config-kv.lua”
}
該配置文件的作用是使用" source"指定的兩個模板文件進(jìn)行渲染,將渲染的結(jié)果分別保存在" destination"指定的文件中,保存成功后,分別運(yùn)行" command"指定的命令來更新并加載配置文件。
配置的更新方式在個推的微服務(wù)體系中,配置的更新方式有兩種:
1.替換配置文件,reload服務(wù)
2.調(diào)用服務(wù)接口直接更新內(nèi)存中的配置
而在Java實現(xiàn)的微服務(wù)中,熱更新配置通常是在代碼中引入Consul Client的依賴,在應(yīng)用啟動時,會初始化一個Watcher來監(jiān)聽Consul上對應(yīng)目錄下K/V的變化,相關(guān)的K/V發(fā)生變化時,Watcher會負(fù)責(zé)將其拉取下來,然后調(diào)用相關(guān)的代碼進(jìn)行配置的更新。
配置中心CCenter在Consul上提供了更友好的WEB UI,并且增加版本控制,每次配置的更新都會生成一個版本,在應(yīng)用版本后,配置才真正生效,可以更加方便地進(jìn)行配置版本間的差異比較,應(yīng)用任意版本的配置。
以上就是個推在微服務(wù)實踐中,基于Consul實現(xiàn)的一套配置管理的方案,作為輕量級的分布式K/V存儲系統(tǒng), Consul非常適合用于配置管理,可以幫助開發(fā)者們方便、快速地搭建配置中心,結(jié)合Consul-Template則可以方便地實現(xiàn)配置的實時更新,在Consul的基礎(chǔ)上進(jìn)行二次開發(fā),實現(xiàn)了配置版本的有效控制,對微服務(wù)的配置管理起到了良好的輔助作用。
網(wǎng)站題目:個推基于Consul的配置管理-創(chuàng)新互聯(lián)
文章位置:http://m.rwnh.cn/article6/cechig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、微信小程序、網(wǎng)站設(shè)計、響應(yīng)式網(wǎng)站、用戶體驗、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)