????Spring Cloud Config是Spring Cloud團(tuán)隊(duì)創(chuàng)建的一個(gè)全新項(xiàng)目躯畴,用來(lái)為分布式系統(tǒng)中的基礎(chǔ)設(shè)施和微服務(wù)應(yīng)用提供集中化的外部配置支持的炼幔,它分為服務(wù)端與客戶(hù)端兩個(gè)部分。其中服務(wù)端也成為分布式配置中心疟赊,它是一個(gè)獨(dú)立的微服務(wù)應(yīng)用棒妨,用來(lái)連接配置倉(cāng)庫(kù)并為客戶(hù)端提供獲取配置信息昭齐、加密/解密信息等訪問(wèn)接口;而客戶(hù)端則是微服務(wù)架構(gòu)中的各個(gè)微服務(wù)應(yīng)用或基礎(chǔ)設(shè)施诀豁,它們通過(guò)指定的配置中心來(lái)管理應(yīng)用資源與業(yè)務(wù)相關(guān)的配置內(nèi)容酪我,并在啟動(dòng)的時(shí)候從配置中心獲取和加載配置信息。Spring Cloud Config實(shí)現(xiàn)了對(duì)服務(wù)端和客戶(hù)端中環(huán)境變量和屬性配置的抽象映射且叁,所以它除了適用于Spring構(gòu)建的應(yīng)用程序之外都哭,也可以在任何其他語(yǔ)言運(yùn)行的應(yīng)用程序中使用。由于Spring Cloud Config實(shí)現(xiàn)的配置中心默認(rèn)采用Git來(lái)存儲(chǔ)配置信息逞带,所以使用spring Cloud Config構(gòu)建的配置服務(wù)器欺矫,天然就支持對(duì)微服務(wù)應(yīng)用配置信息的版本管理,并且可以通過(guò)Git等客戶(hù)端工具來(lái)方便地管理和訪問(wèn)配置內(nèi)容展氓。當(dāng)然它也提供了對(duì)其他存儲(chǔ)方式的支持穆趴,比如SVN倉(cāng)庫(kù)、本地化文件系統(tǒng)遇汞。接下來(lái)未妹,我們從一個(gè)簡(jiǎn)單的入門(mén)示例開(kāi)始學(xué)習(xí)Spring Cloud Config服務(wù)端以及客戶(hù)端的詳細(xì)構(gòu)建與使用方法。
????在本節(jié)中空入,我們將演示如何構(gòu)建基于Git存儲(chǔ)的分布式配置中心络它,同時(shí)對(duì)配置的詳細(xì)規(guī)則進(jìn)行講解,并在客戶(hù)端中演示如何通過(guò)配置指定微服務(wù)應(yīng)用的所屬配置中心歪赢,并讓其能夠從配置中心獲取配置信息并綁定到代碼中的整個(gè)過(guò)程化戳。
通過(guò)Spring Cloud Config構(gòu)建一個(gè)分布式配置中心非常簡(jiǎn)單,只需要以下三步埋凯。
??????創(chuàng)建一個(gè)基礎(chǔ)的Spring Boot工程点楼,命名為config-server,并在pom.xml中引入下面的依賴(lài):
??????創(chuàng)建Spring Boot的程序主類(lèi)白对,并添加@EnableConfigServer注解掠廓,開(kāi)啟Spring Cloud Config的服務(wù)端功能。
??????在application.properties中添加配置服務(wù)的基本信息以及Git倉(cāng)庫(kù)的相關(guān)信息甩恼,如下所示:
其中Git等配置信息分別表示如下內(nèi)容:
??????spring.cloud.config.server.git.uri:配置Git倉(cāng)庫(kù)位置
??????spring.cloud.config.server.git.searchPaths:配置倉(cāng)庫(kù)路徑下單相對(duì)搜索位置蟀瞧,可以配置多個(gè)
??????spring.cloud.config.server.git.username:訪問(wèn)Git倉(cāng)庫(kù)的用戶(hù)名
??????spring.cloud.config.server.git.password:訪問(wèn)Git倉(cāng)庫(kù)的用戶(hù)密碼
??????spring.cloud.config.label:git倉(cāng)庫(kù)分支名稱(chēng)
????到這里沉颂,使用一個(gè)通過(guò)Spring Cloud Config實(shí)現(xiàn),并使用Git管理內(nèi)容等分布式配置中心就完成了黄橘。我們可以將該應(yīng)用先啟動(dòng)起來(lái)兆览,確保沒(méi)有錯(cuò)誤產(chǎn)生,然后進(jìn)入下面等地學(xué)習(xí)內(nèi)容塞关。
????為了驗(yàn)證上面完全的分布式配置中心config-server抬探,根據(jù)git配置信息中指定的倉(cāng)庫(kù)位置,在https://github.com/erghjmncq6643981/demo/tree/master下創(chuàng)建respo目錄作為配置倉(cāng)庫(kù)帆赢,并根據(jù)不同環(huán)境新建下面4個(gè)配置文件:
??????didispace.properties
??????didispace-dev.properties
??????didispace-test.properties
??????didispace-prod.properties
????在這4個(gè)配置文件中均設(shè)置了一個(gè)from屬性小压,并為每個(gè)配置文件分別設(shè)置了不同的值,如下所示:
??????from=git-default-1.0
??????from=git-dev-1.0
??????from=git-test-1.0
??????from=git-prod-1.0
????為了測(cè)試版本控制椰于,在該Git倉(cāng)庫(kù)的master分支中怠益,我們?yōu)閒rom屬性加入1.0的后綴,同時(shí)創(chuàng)建一個(gè)config-label-test分支瘾婿,并將各配置文件中的值用2.0作為后綴蜻牢。
????完成了這些準(zhǔn)備工作之后,我們就可以通過(guò)瀏覽器偏陪、POSTMAN或CURL等工具直接來(lái)訪問(wèn)我們的配置內(nèi)容了抢呆。訪問(wèn)配置信息的URL與配置文件的映射關(guān)系如下所示:
??????/{application}/{profile}[/{label}]
??????/{application}-{profile}.yml
??????/{application}-{profile}.properties
??????/{label}/{application}-{profile}.properties
????上面的url會(huì)映射{application}-{profile}.properties對(duì)應(yīng)的配置文件,其中{label}對(duì)應(yīng)Git上不同的分支笛谦,默認(rèn)為master抱虐。我們可以嘗試構(gòu)造不同的url來(lái)訪問(wèn)不同的配置內(nèi)容,比如要訪問(wèn)kyle分支饥脑,didispace應(yīng)用的prod不同的配置內(nèi)容恳邀,比如,要訪問(wèn)kyle分支灶轰,didispace應(yīng)用的prod環(huán)境谣沸,就可以訪問(wèn)這個(gè)url:http://localhost:8888/didispace/prod/kyle,并獲得如下返回信息框往。
????我們可以看到該JSON中返回了應(yīng)用名didispace鳄抒,環(huán)境名prod,分支名kyle椰弊,以及默認(rèn)default環(huán)境和prod環(huán)境的配置內(nèi)容。另外瓤鼻,之前沒(méi)有提到過(guò)的version秉版,從下圖我們可以觀察到,它對(duì)應(yīng)的是在Git上的commit號(hào)茬祷。
????同時(shí)清焕,我們可以看到config-server的控制臺(tái)中還輸出了下面的內(nèi)容,配置服務(wù)器在從Git中獲取配置信息后,會(huì)存儲(chǔ)一份在config-server的文件系統(tǒng)中秸妥,實(shí)質(zhì)上config-sever是通過(guò)git clone的文件系統(tǒng)中滚停,實(shí)質(zhì)上config-server是通過(guò)git clone命令將配置內(nèi)容復(fù)制了一份在本地存儲(chǔ),然后讀取這些內(nèi)容并返回給微服務(wù)應(yīng)用進(jìn)行加載粥惧。
????config-server通過(guò)Git在本地倉(cāng)庫(kù)暫存键畴,可以有效防止當(dāng)Git倉(cāng)庫(kù)出現(xiàn)故障而引起無(wú)法加載配置信息的情況。我們可以通過(guò)斷開(kāi)網(wǎng)絡(luò)突雪,再次發(fā)起http://localhost:8888/didispace/prod/kyle請(qǐng)求起惕,在控制臺(tái)中可輸出Could not pull remote for kyle,但是它依然會(huì)為該請(qǐng)求返回配置內(nèi)容咏删,這些內(nèi)容源于之前訪問(wèn)時(shí)存于config-server本地文件系統(tǒng)中的配置內(nèi)容惹想。
????在動(dòng)手實(shí)踐了上面關(guān)于Spring Cloud Config的基礎(chǔ)入門(mén)內(nèi)容之后,在這里我們深入理解一些它是如何運(yùn)作起來(lái)的督函。下面所示的是上一節(jié)我們構(gòu)建案例的基本結(jié)構(gòu)嘀粱。
????其中,主要包含下面幾個(gè)要素辰狡。
??????遠(yuǎn)程Git倉(cāng)庫(kù):用來(lái)存儲(chǔ)配置文件的地方锋叨,上例中我們用來(lái)存儲(chǔ)針對(duì)應(yīng)用名為didispace的多環(huán)境配置文件:didispace-{profile}.properties。
??????Config Server:這是我們上面構(gòu)建的分布式配置中心搓译,config-server工程悲柱,在該工程中指定了所要連接的Git倉(cāng)庫(kù)位置以及賬戶(hù)、密碼等連接信息些己。
??????本地Git倉(cāng)庫(kù):在Config Server的文件系統(tǒng)中豌鸡,每次客戶(hù)端請(qǐng)求獲取配置信息時(shí),Config Server從Git倉(cāng)庫(kù)中獲取最新配置到本地段标,然后客戶(hù)端請(qǐng)求獲取配置信息時(shí)涯冠,Config Server從Git倉(cāng)庫(kù)中獲取最新配置到本地,然后在本地Git倉(cāng)庫(kù)中讀取并返回逼庞。當(dāng)遠(yuǎn)程倉(cāng)庫(kù)無(wú)法獲取時(shí)蛇更,直接將本地內(nèi)容返回。
??????Service A赛糟、Service B:具體的微服務(wù)應(yīng)用派任,它們指定了Config Server的地址,從而實(shí)現(xiàn)從外部獲取應(yīng)用自己要用的配置信息璧南。這些應(yīng)用在啟動(dòng)的時(shí)候掌逛,會(huì)向Config Server請(qǐng)求獲取配置信息來(lái)進(jìn)行加載。
客戶(hù)端應(yīng)用從配置管理中獲取配置信息遵從下面的執(zhí)行流程:
????應(yīng)用啟動(dòng)時(shí)司倚,根據(jù)bootstrap.properties中配置的應(yīng)用名{application}豆混、環(huán)境名{profile}篓像、分支名{label},向Config Server請(qǐng)求獲取配置信息皿伺。
????Config Server根據(jù)自己維護(hù)的Git倉(cāng)庫(kù)信息和客戶(hù)端傳遞過(guò)來(lái)的配置定位信息去查找配置信息员辩。
????通過(guò)git clone命令將找到的配置信息下載到Config Server的文件系統(tǒng)中。
????Config Server創(chuàng)建Spring的Applicationcontext實(shí)例鸵鸥,并從Git本地倉(cāng)庫(kù)中加載配置文件奠滑,最后將這些配置內(nèi)容讀取出來(lái)返回給客戶(hù)端應(yīng)用。
????客戶(hù)端應(yīng)用在獲得外部配置文件后加載到客戶(hù)端的ApplicationContext實(shí)例脂男,該配置內(nèi)容的優(yōu)先級(jí)高于客戶(hù)端Jar包內(nèi)部的配置內(nèi)容养叛,所以在Jar包中重復(fù)的內(nèi)容將不再被加載。
????Config Server巧妙地通過(guò)git clone將配置信息存于本地宰翅,起到緩存的作用弃甥,即使當(dāng)Git服務(wù)端無(wú)法訪問(wèn)的時(shí)候,依賴(lài)可以取Config Server中的緩存內(nèi)容進(jìn)行使用汁讼。
????在Spring Cloud Config的服務(wù)端淆攻,對(duì)于配置倉(cāng)庫(kù)的默認(rèn)實(shí)現(xiàn)采用了Git。Git非常適用于存儲(chǔ)配置內(nèi)容嘿架,它可以非常方便地使用各種第三方工具來(lái)對(duì)其進(jìn)行管理更新和版本化瓶珊,同時(shí)Git倉(cāng)庫(kù)倉(cāng)庫(kù)的Hook功能還可以幫助我們實(shí)時(shí)監(jiān)控配置內(nèi)容的修改。其中耸彪,Git自身的版本控制功能正是其他一些配置中心所欠缺的伞芹,通過(guò)Git進(jìn)行存儲(chǔ)意味著,一個(gè)應(yīng)用的不同部署實(shí)例可以從Spring Cloud Config的服務(wù)端獲取不同的版本配置蝉娜,從而支持一些特殊的應(yīng)用場(chǎng)景唱较。
????由于Spring Cloud Config中默認(rèn)使用Git,所以對(duì)于Git的配置非常簡(jiǎn)單召川,只需在Config Server的application.properties中設(shè)置spring.cloud.config.server.git.uri屬性南缓,為其指定Git倉(cāng)庫(kù)的網(wǎng)絡(luò)地址和賬戶(hù)信息即可,比如在快速入門(mén)一節(jié)中的例子:
????如果我們將該值通過(guò)file://前綴來(lái)設(shè)置為一個(gè)文件地址(在Windows系統(tǒng)中荧呐,需要使用file:///來(lái)定位文件內(nèi)容)汉形,那么它將以本地倉(cāng)庫(kù)的方式運(yùn)行,這樣我們就可以脫離Git服務(wù)端來(lái)進(jìn)行調(diào)試與開(kāi)發(fā)倍阐,比如:
????其中概疆,${user.home}代表當(dāng)前用戶(hù)的所屬目錄。file://配置的本地文件系統(tǒng)方式雖然對(duì)于本地開(kāi)發(fā)調(diào)試時(shí)使用非常方便峰搪,但是該方式也僅用于開(kāi)發(fā)與測(cè)試届案,在生產(chǎn)環(huán)境中,請(qǐng)務(wù)必大家自己的Git倉(cāng)庫(kù)來(lái)存儲(chǔ)配置資源罢艾。
????{application}楣颠、{profile}、{label}這些占位符除了用于標(biāo)識(shí)配置文件的規(guī)則之外咐蚯,還可以用于Config Server中對(duì)Git倉(cāng)庫(kù)地址的URI配置童漩。比如,我們可以通過(guò){application}占位符來(lái)實(shí)現(xiàn)一個(gè)應(yīng)用對(duì)應(yīng)一個(gè)Git倉(cāng)庫(kù)目錄的配置效果春锋,具體配置實(shí)現(xiàn)如下:
????其中矫膨,{application}代表了應(yīng)用名,所以當(dāng)客戶(hù)端應(yīng)用向Config Server發(fā)起獲取配置的請(qǐng)求時(shí)期奔,Config Server會(huì)根據(jù)客戶(hù)端spring.application.name信息來(lái)填充{application}占位符以定位配置資源的存儲(chǔ)位置侧馅,從而實(shí)現(xiàn)根據(jù)微服務(wù)應(yīng)用的屬性動(dòng)態(tài)獲取不同的位置的配置。另外呐萌,這些占位符中馁痴,{label}參數(shù)較為特別,如果Git的分支和標(biāo)簽名包含"/"肺孤,那么{label}參數(shù)在HTTP的URL中應(yīng)該使用"(_)"來(lái)替代罗晕,以避免改變了URI含義,指向到其他的URI資源赠堵。
github中目錄結(jié)構(gòu)必須如下所示
注意:假如使用yml文件小渊,需要在占位符上加'',如下圖所示
?當(dāng)我們使用Git作為配置中心來(lái)存儲(chǔ)各個(gè)微服務(wù)應(yīng)用配置文件的時(shí)候茫叭,該功能會(huì)變得非常有用酬屉,通過(guò)在URI中使用占位符可以幫助我們規(guī)劃和實(shí)現(xiàn)通用的倉(cāng)庫(kù)配置。例如揍愁,我們可以對(duì)微服務(wù)應(yīng)用做如下規(guī)劃呐萨。
??????代碼庫(kù):使用服務(wù)名作為Git倉(cāng)庫(kù)名稱(chēng),比如會(huì)員服務(wù)的代碼庫(kù)https://github.com/erghjmncq6643981/demo/respo/member-service吗垮。
??????配置庫(kù):使用服務(wù)名加上-config后綴作為Git倉(cāng)庫(kù)名稱(chēng)垛吗,比如上面會(huì)員服務(wù)對(duì)應(yīng)的配置庫(kù)地址位置https://github.com/erghjmncq6643981/demo/respo/member-service-config。
????這時(shí)烁登,我們就可以通過(guò)使用spring.cloud.config.server.git.rui=https://github.com/erghjmncq6643981/demo/respo/{application}-config配置怯屉,來(lái)同時(shí)匹配多個(gè)不同服務(wù)的配置倉(cāng)庫(kù)。
Config Server除了可以通過(guò)application和profile模式來(lái)匹配配置倉(cāng)庫(kù)之外饵沧,還支持通過(guò)帶有通配符的表達(dá)式來(lái)匹配锨络,以實(shí)現(xiàn)更為復(fù)雜的配置需求。并且當(dāng)我們有多個(gè)匹配規(guī)則的時(shí)候狼牺,還可以用逗號(hào)來(lái)分割多個(gè){application}/{profile}配置規(guī)則羡儿,比如:
????上述配置內(nèi)容通過(guò)spring.cloud.config.server.git.uri屬性,指定了一個(gè)默認(rèn)的倉(cāng)庫(kù)位置是钥,當(dāng)使用{application}/{profile}模式未能匹配到合適的倉(cāng)庫(kù)時(shí)掠归,就將在該默認(rèn)倉(cāng)庫(kù)位置下獲取配置信息缅叠。除此之外,還配置了三個(gè)倉(cāng)庫(kù)虏冻,分別是dev肤粱、test、prod厨相。其中dev倉(cāng)庫(kù)匹配dev/*的模式领曼,所以無(wú)論profile是什么,它都能匹配application名稱(chēng)為dev的應(yīng)用蛮穿。并且我們可以注意到庶骄,它存儲(chǔ)的配置文件位置還采用了Config Server的本地文件系統(tǒng)中的內(nèi)容。對(duì)于此配置践磅,我們可以通過(guò)訪問(wèn)http://localhost8888/dev/profile的請(qǐng)求來(lái)驗(yàn)證到該倉(cāng)庫(kù)的配置內(nèi)容单刁,其中profile可以為任意值。而test和prod倉(cāng)庫(kù)均使用了Git倉(cāng)庫(kù)的存儲(chǔ)音诈,并且test倉(cāng)庫(kù)未配置匹配規(guī)則幻碱,所以它只匹配application名為test的應(yīng)用;prod倉(cāng)庫(kù)則需要匹配application為prod并且profile為pp開(kāi)頭细溅,或者application為online并且profile為oo開(kāi)頭的應(yīng)用和環(huán)境褥傍。
????當(dāng)配置多個(gè)倉(cāng)庫(kù)的時(shí)候,Config Server在啟動(dòng)時(shí)會(huì)直接克隆第一個(gè)倉(cāng)庫(kù)的配置庫(kù)喇聊,其他的配置庫(kù)只有在請(qǐng)求時(shí)才會(huì)克隆到本地恍风,所以對(duì)于倉(cāng)庫(kù)排列可以根據(jù)配置內(nèi)容的重要程度有所區(qū)分。另外誓篱,如果表達(dá)式是以通配符開(kāi)始的朋贬,那么需要使用引號(hào)將配置內(nèi)容引起來(lái)。
????由于配置中心存儲(chǔ)的內(nèi)容比較敏感窜骄,做一定的安全處理是必需的锦募。為配置中心實(shí)現(xiàn)安全保護(hù)的方式有很多,比如物理網(wǎng)絡(luò)限制邻遏、OAuth2授權(quán)等糠亩。不過(guò),由于我們的微服務(wù)應(yīng)用和配置中心都構(gòu)建于Spring Boot基礎(chǔ)上准验,所以與Spring Security結(jié)合使用會(huì)更加方便赎线。
? ? ? ?我們只需要在配置中心的pom.xml中加入spring-boot-starter-security依賴(lài),不需要做任何其他改動(dòng)就能實(shí)現(xiàn)對(duì)配置中心訪問(wèn)的安全保護(hù)糊饱。
????默認(rèn)情況下垂寥,我們可以獲得一個(gè)名為user的用戶(hù),并且在配置中心啟動(dòng)的時(shí)候,在日志中打印該用戶(hù)的隨機(jī)密碼滞项,具體如下:
????大多數(shù)情況下狭归,我們并不會(huì)使用隨機(jī)生成密碼的機(jī)制。我們可以在配置文件中指定用戶(hù)和密碼蓖扑,比如:
????由于我們已經(jīng)為config-server設(shè)置了安全保護(hù)唉铜,如果這時(shí)候連接到配置中心的客戶(hù)端中沒(méi)有設(shè)置對(duì)應(yīng)的安全信息,在獲取配置信息時(shí)會(huì)返回401錯(cuò)誤律杠。所以,需要通過(guò)配置的方式在客戶(hù)端中加入安全信息來(lái)通過(guò)校驗(yàn)竞惋,比如:
????在微服務(wù)架構(gòu)中柜去,我們通常會(huì)采用DevOps的組織方式來(lái)降低因團(tuán)隊(duì)間溝通造成的巨大成本,以加速微服務(wù)應(yīng)用的交付能力拆宛。這就使得原本由運(yùn)維團(tuán)隊(duì)控制的線上信息將交由微服務(wù)所屬組織的成員自行維護(hù)嗓奢,其中將會(huì)包括大量的敏感信息,比如數(shù)據(jù)庫(kù)的賬戶(hù)與密碼等浑厚。顯然股耽,如果我們直接將敏感信息以明文的方式存儲(chǔ)于微服務(wù)應(yīng)用的配置文件中是非常危險(xiǎn)的。針對(duì)這個(gè)問(wèn)題钳幅,Spring Cloud Config提供了對(duì)屬性進(jìn)行加密解密的功能物蝙,以保護(hù)配置文件中的信息安全。比如下面的例子:
????在Spring Cloud Config中通過(guò)在屬性值前使用{cipher}前綴來(lái)標(biāo)注該內(nèi)容是一個(gè)加密值敢艰,當(dāng)微服務(wù)客戶(hù)端加載配置時(shí)诬乞,配置中心會(huì)自動(dòng)為帶有{cipher}前綴的值進(jìn)行解密。通過(guò)該機(jī)制的實(shí)線钠导,運(yùn)維團(tuán)隊(duì)就可以放心地將線上信息的加密資源給到微服務(wù)團(tuán)隊(duì)震嫉,而不用擔(dān)心這些敏感信息遭到泄露了。下面我們來(lái)具體介紹如何在配置中心使用該項(xiàng)功能牡属。
????在使用Spring Cloud Config的加密解密功能時(shí)票堵,有一個(gè)必要的前提需要我們注意。為了啟用該功能逮栅,我們需要在配置中心的運(yùn)行環(huán)境中安裝不限長(zhǎng)度的JCE版本(Unlimited Strength Java Cryptography Extension)悴势。雖然,JCE功能在JRE中自帶证芭,但是默認(rèn)使用的是長(zhǎng)度限制的版本瞳浦。我們可以從Oracle的官方網(wǎng)站下載到它,它是一個(gè)壓縮包废士,解壓后可以看到下面三個(gè)文件:
????我們需要將local_policy.jar和US_export_policy.jar兩個(gè)文件復(fù)制到$JAVA_HOME/jre/lib/security目錄下叫潦,覆蓋原來(lái)的默認(rèn)內(nèi)容。到這里官硝,加密解密的準(zhǔn)備工作就完成了矗蕊。
????在完成了JCE的安裝后短蜕,可以嘗試啟動(dòng)配置中心。在控制臺(tái)中傻咖,將會(huì)輸出一些配置中心持有的端點(diǎn)朋魔,主要包括如下幾個(gè)。
??????/encrypt/status:查看加密功能狀態(tài)的端點(diǎn)卿操。
??????/key:查看密鑰的端點(diǎn)警检。
??????/encrypt:對(duì)請(qǐng)求的body內(nèi)容進(jìn)行加密的端點(diǎn)。
??????/decrypt:對(duì)請(qǐng)求的body內(nèi)容進(jìn)行解密的端點(diǎn)害淤。
可以嘗試通過(guò)GET請(qǐng)求訪問(wèn)/encrypt/status端點(diǎn)扇雕,我們將得到如下內(nèi)容;
????該返回信息說(shuō)明當(dāng)前配置中心的加密功能還不能使用窥摄,因?yàn)闆](méi)有為加密服務(wù)配置對(duì)應(yīng)的密鑰镶奉。
????我們可以通過(guò)encrpt.key屬性在配置文件中直接指定密鑰信息(對(duì)稱(chēng)性密鑰),比如:
????加入上述配置信息后崭放,重啟配置中心哨苛,再訪問(wèn)/encrpt/status端點(diǎn),我們將得到如下內(nèi)容:????
????此時(shí)币砂,我們配置中心的加密解密功能就已經(jīng)可以使用了建峭,不妨嘗試訪問(wèn)一下/encrypt和/decrypt端點(diǎn)來(lái)使用加密和解密的功能。注意道伟,這兩個(gè)端點(diǎn)都說(shuō)POST請(qǐng)求迹缀,加密和解密信息需要通過(guò)請(qǐng)求體來(lái)發(fā)送。比如蜜徽,以curl命令為例祝懂,我們可以通過(guò)下面的方式調(diào)用加密與解密端點(diǎn):
????這里,我們通過(guò)配置encrypt.key參數(shù)來(lái)指定密鑰的實(shí)現(xiàn)方式采用了對(duì)稱(chēng)性加密拘鞋。這種方式實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單砚蓬,只需要配置一個(gè)參數(shù)即可。另外盆色,我們也可以使用環(huán)境變量ENCRYPT_KEY來(lái)進(jìn)行配置灰蛙,讓密鑰信息外部化存儲(chǔ)。
????在完成了上述驗(yàn)證之后隔躲,確定配置服務(wù)中心已經(jīng)正常運(yùn)作摩梧,下面我們嘗試如何在服務(wù)應(yīng)用中獲取上述 配置信息。
??????創(chuàng)建一個(gè)Spring Boot應(yīng)用宣旱,命名config-client仅父,并在pom.xml中引入下述依賴(lài):
??????創(chuàng)建Spring Boot的應(yīng)用主類(lèi),具體如下:
??????創(chuàng)建bootstrap.properties配置,來(lái)指定獲取配置文件的config-server位置笙纤,例如:
上述配置參數(shù)與Git中存儲(chǔ)的配置文件中各個(gè)部分的對(duì)應(yīng)關(guān)系如下所示耗溜。
??????spring.application.name:對(duì)應(yīng)配置文件規(guī)則中的{application}部分
??????spring.cloud.config.profile:對(duì)應(yīng)配置文件規(guī)則中的{profile}部分
??????spring.cloud.config.label:對(duì)應(yīng)配置文件中的{label}部分
??????spring.cloud.config.uri:配置中心config-server的地址
??????spring.cloud.config.discovery.enabled:使用注冊(cè)中心找尋config-server的地址
??????spring.cloud.config.discovery.serviceId:配置中心在注冊(cè)中心的applicationName
????這里需要格外注意,上面這些屬性必須配置在bootstrap.properties中省容,這樣config-server中的配置信息才能被正確加載抖拴。在第2章中,我們?cè)敿?xì)說(shuō)明了Spring Boot對(duì)配置文件的加載順序腥椒,對(duì)于本應(yīng)用jar包之外的配置文件加載會(huì)優(yōu)先與應(yīng)用jar包內(nèi)的配置內(nèi)容阿宅,而通過(guò)bootstrap.properties對(duì)config-server的配置,使得該應(yīng)用會(huì)從實(shí)現(xiàn)了外部化配置寞酿。
??????創(chuàng)建一個(gè)RESTful接口來(lái)返回配置中心的from屬性家夺,通過(guò)@Value("from")綁定配置服務(wù)中配置的from屬性,具體實(shí)現(xiàn)如下:
??????除了通過(guò)@Value注解綁定注入之外伐弹,也可以通過(guò)Environment對(duì)對(duì)象來(lái)獲取配置屬性,比如:
????啟動(dòng)config-client應(yīng)用榨为,并訪問(wèn)http://localhost:8881/from惨好,我們就可以根據(jù)配置內(nèi)容輸出對(duì)應(yīng)環(huán)境的from內(nèi)容了。根據(jù)當(dāng)前配置随闺,我們可以獲得如下返回的內(nèi)容:
????可以繼續(xù)通過(guò)修改bootstrap.properties中的配置內(nèi)容獲取不同的配置信息來(lái)熟悉配置服務(wù)中的配置規(guī)則日川。
如果需要給我修改意見(jiàn)的發(fā)送郵箱:erghjmncq6643981@163.com
本博客的代碼示例已上傳GitHub:分布式配置中心https://github.com/erghjmncq6643981/SpringCloudConfig
資料參考:《Spring Cloud 微服務(wù)實(shí)戰(zhàn)》
轉(zhuǎn)發(fā)博客,請(qǐng)注明矩乐,謝謝龄句。