配置中心:Spring Cloud Config

聲明:
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 ConfigNacos不同,它雖然也支持自身發(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
    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)象

  • 使能配置中心@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-retryspring-boot-starter-aop,具體請(qǐng)看Config Client Retry
    • (可選)超時(shí)相關(guān)配置
    spring.cloud.config.request-read-timeout=
    spring.cloud.config.request-connect-timeout=
    
  • 啟動(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容