聲明:
1.本節(jié)將會(huì)把配置中心集成在Eureka的服務(wù)中心里,所以將會(huì)使用Spring Cloud Netflix Eureka + Spring Cloud Config來完成本節(jié)內(nèi)容
2.入門級(jí)文檔,更多內(nèi)容會(huì)持續(xù)更新,不足之處,望不吝指點(diǎn)
一、簡介
Spring Cloud Config和Nacos不同,它雖然也支持自身發(fā)布配置,但是其主要的配置來源還是其他的存儲(chǔ)類應(yīng)用,比如Git、SVN、Valut、數(shù)據(jù)庫等等,Spring Cloud Config的作用就是提供一個(gè)抽象,不用讓用戶得知配置的具體來源,具體的操作細(xì)節(jié)等等。它就像是一個(gè)代理人,由它幫我們將配置從目標(biāo)地方取出來,然后按照我們?cè)O(shè)置的策略分享給需要這些配置的服務(wù)。Spring Cloud Config的默認(rèn)配置倉庫是Git,這也是使用得最多得一種方案,故本節(jié)也將使用Git來進(jìn)行講解和演示。
二、配置中心(服務(wù)端,配置發(fā)布者)
- 依賴(不顯示Eureka相關(guān)依賴)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- 配置(基于Git)
- 端口號(hào)
Spring Cloud Config Client默認(rèn)會(huì)從8888端口獲取配置,所以你可以為了圖個(gè)方便將配置中心的端口號(hào)也改為8888,本節(jié)示例使用的端口號(hào)是8089 - 關(guān)閉
Spirng Cloud Config Client
服務(wù)端不需要
spring.cloud.config.enabled=false- (可選)配置的發(fā)布路徑前綴
默認(rèn)為空字符串,即從根目錄下直接訪問就可以了,但是本節(jié)為了和Eureka服務(wù)中心的相關(guān)的配置不沖突,我修改了前綴為config-mtk,這樣所有的配置將會(huì)發(fā)布在/config-mtk/下
spring.cloud.config.server.prefix=/config-mtk- Git倉庫的路徑
- 可以使用本地的Git倉庫,如果倉庫路徑的開頭是
file://的話,就代表啟用本地的Git倉庫作為配置來源,注意Windows下應(yīng)當(dāng)是以file:///開頭 - 可以在路徑名中使用特殊的占位符,具體可看Placeholders in Git URI
- 可以使用本地的Git倉庫,如果倉庫路徑的開頭是
spring.cloud.config.server.git.uri=https://xxx/shiinamutsuki/config-center- Git倉庫用戶名及密碼
spring.cloud.config.server.git.username= spring.cloud.config.server.git.password=- (極其重要)SSL驗(yàn)證
如果你想通過SSL來保證訪問的安全性,那請(qǐng)?zhí)^這段。如果你不知道SSL驗(yàn)證是啥,我建議這里關(guān)閉SSL驗(yàn)證,否則你將會(huì)陷入PKIX path building failed: sun.security.provider .certpath.SunCertPathBuilderException: unable to find valid certifi cation path to requested target的錯(cuò)誤,而為此痛苦不已,當(dāng)然你也可以選擇直接面對(duì)它,這時(shí)你需要下載對(duì)應(yīng)網(wǎng)站的證書,并將其添加到你jre的證書庫中,然后稍等一會(huì)兒。
spring.cloud.config.server.git.skip-ssl-validation=true- (可選)配置默認(rèn)分支
如果客戶端沒有指定從哪個(gè)分支獲取配置,將會(huì)從默認(rèn)分支中提取
spring.cloud.config.server.git.default-label=<分支名>- (可選)配置配置獲取的超時(shí)時(shí)間,默認(rèn)5s
spring.cloud.config.server.git.timeout=5- (可選)強(qiáng)制拉取更新
Spring Cloud Config會(huì)在本地保存一個(gè)克隆的倉庫,但是如果因?yàn)橐馔鈱?dǎo)致這個(gè)克隆的倉庫文件發(fā)生了變化,那么Spring Cloud Config將無法把克隆的倉庫進(jìn)行更新,這時(shí)如果配置了強(qiáng)制拉取更新,那么這個(gè)問題就會(huì)得以解決。
spring.cloud.config.server.git.force-pull=true- (可選)強(qiáng)制刪除未匹配到的分支
Spring Cloud Config默認(rèn)不會(huì)刪除任何本地倉庫的任何分支,即使遠(yuǎn)程倉庫中的對(duì)應(yīng)分支已經(jīng)刪除,除非重啟配置中心,這樣將會(huì)新建一個(gè)本地倉庫。你可能不太清楚這會(huì)產(chǎn)生什么問題,讓我舉個(gè)例子,假設(shè)遠(yuǎn)端倉庫有兩個(gè)分支一個(gè)是test,另外一個(gè)是master,你在你的客戶端中配置了spring.cloud.config.label=test,master,想達(dá)到我無需改動(dòng)配置,只要將遠(yuǎn)端倉庫的test分支刪除,就可以實(shí)現(xiàn)從測試環(huán)境到正式環(huán)境的轉(zhuǎn)換的目的。這時(shí)你會(huì)發(fā)現(xiàn)就算你刪除了test分支,但是你的應(yīng)用依舊在測試環(huán)境中,因?yàn)楸镜氐膫}庫壓根就沒有刪除test分支。
spring.cloud.config.server.git.delete-untracked-branches=true- (可選)緩存配置的持續(xù)的時(shí)間
由于有本地倉庫的存在,所以如果你的應(yīng)用配置更新不頻繁,且對(duì)在配置做出變化時(shí)需要應(yīng)用立刻進(jìn)行響應(yīng)的要求不高,那么你可以進(jìn)行這項(xiàng)配置,Spring Cloud Config將會(huì)每隔一段時(shí)間將本地倉庫更新,而不是在每次請(qǐng)求配置的時(shí)候更新
# 默認(rèn)是0 spring.cloud.config.server.git.refresh-rate=5- (可選)如果你想使用
SSH的鏈接,你可以參照Authentication
和Git SSH configuration using properties - (可選)配置多個(gè)Git倉庫,可以參照Pattern Matching and Multiple Repositories
- (可選)全局配置
Spring Cloud Config也支持像Nacos那樣自己發(fā)布配置,不過這個(gè)配置是全局配置,對(duì)所有從配置中心獲取配置的人都會(huì)返回額外返回一份這個(gè)全局配置。附加說一點(diǎn),全局配置不僅僅只可以配置在配置中心本身里,也可以配置在遠(yuǎn)端倉庫中,當(dāng)你的遠(yuǎn)端倉庫存在一個(gè)application.yaml或者是application.properties文件時(shí),該配置文件的內(nèi)容也將額外作為全局配置一起唄返回。這兩種全局配置的方式可以一起使用。下列例子中,我將Eureka Client的配置作為全局配置設(shè)置在了配置中心中。
spring cloud: config: server: overrides: eureka.client.service-url.defaultZone: http://mtk:123456@localhost:8089/eureka/ eureka.instance.prefer-ip-address: true eureka.instance.instance-id: $\{spring.application.name}:$\{spring.cloud.client.ip-address}:$\{server.port}$\{}將會(huì)被解析為${},如果直接使用${}你會(huì)發(fā)現(xiàn)有趣的現(xiàn)象 - 端口號(hào)
- 使能配置中心
@EnableConfigServer
@SpringBootApplication
@EnableConfigServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- 驗(yàn)證
- 啟動(dòng)配置中心
- 訪問配置
$ curl localhost:8089/config-mtk/eureka-test/eureka-test-provider.properties cn.mtk.hello: hello eureka.client.service-url.defaultZone: http://mtk:123456@localhost:8089/eureka/ eureka.instance.instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} eureka.instance.prefer-ip-address: true需要說明的是,即使沒有找到對(duì)應(yīng)的配置,全局配置也會(huì)被返回。附加:支持的訪問url格式可以參照:
{prefix}/{application}/{profile}[/{label}]
{prefix}/{application}-{profile}.yml
{prefix}/{label}/{application}-{profile}.yml
{prefix}/{application}-{profile}.properties
{prefix}/{label}/{application}-{profile}.properties
三、配置客戶端(客戶端,配置接收者)
- 依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- 配置
注意:客戶端由于要在接受本地配置要前先接受遠(yuǎn)端配置,故需要將Spring Cloud Config相關(guān)的配置配置在啟動(dòng)配置文件中bootstrap.yaml- 服務(wù)名
服務(wù)名將會(huì)作為配置獲取路徑的組成部分之一,所以需要配置好 - 配置中心地址
注意配置到訪問前綴為止
spring.cloud.config.uri=http://localhost:8089/config-mtk- 訪問的配置分支
spring.cloud.config.label=eureka-test- (可選)快速失敗操作
如果你需要客戶端在沒有接收到配置時(shí)拋出異常并中止服務(wù),你可以進(jìn)行該項(xiàng)配置
spring.cloud.config.fail-fast=true- (可選)(承接快速失敗操作)如果你不想單純一次就判定為失敗,你可以嘗試使用
spring.cloud.config.retry.*系列的配置來進(jìn)行失敗重試的相關(guān)配置,不過你得添加額外的依賴spring-retry和spring-boot-starter-aop,具體請(qǐng)看Config Client Retry - (可選)超時(shí)相關(guān)配置
spring.cloud.config.request-read-timeout= spring.cloud.config.request-connect-timeout= - 服務(wù)名
- 啟動(dòng)
- 額外說明
-
ConfigServicePropertySourceLocator這個(gè)Bean包含了許多配置文件中不能配置的配置,比如RestTemplate實(shí)例等等,如果需要可以嘗試對(duì)該Bean進(jìn)行自定義,具體操作可查Providing A Custom RestTemplate - 你會(huì)發(fā)現(xiàn)本節(jié)是將服務(wù)發(fā)現(xiàn)相關(guān)的配置放在了配置中心中,而每個(gè)客戶端都只配置了配置中心的配置,那么你會(huì)想,如果配置中心發(fā)生了變更,要一個(gè)個(gè)客戶端去更改配置不是太過麻煩,能不能讓服務(wù)中心運(yùn)行在配置中心之前呢,答案是可以的,但是那樣同樣會(huì)造成幾個(gè)問題,每個(gè)客戶端需要配置服務(wù)中心的地址了,且啟動(dòng)階段時(shí)間將會(huì)大大延長,因?yàn)樾枰趩?dòng)期間進(jìn)行服務(wù)發(fā)現(xiàn)的配置,然后獲取配置中心的服務(wù),然后獲取配置,然后進(jìn)行配置。關(guān)于這部分內(nèi)容你可以參考Discovery First Bootstrap
-
參考文檔:
[1] Spring Cloud Config官方文檔2.2.2.RELEASE