Spring Cloud Config配置詳解

Spring Cloud Config.png

在前文服務注冊Eureka原理及集群配置中即硼,我們配置Eureka集群時鸿染,可以通過--spring.profiles.active=peer1來指定微服務在啟動時使用哪段配置砾淌。但往往在微服務架構(gòu)中悬嗓,需要維護大量的配置文件谁撼,在開發(fā)蒜绽、測試兵罢、生產(chǎn)環(huán)境,這些配置文件又有所不同滓窍,同時還希望能做到修改配置文件時卖词,微服務能夠不停止服務。

也就是說在微服務架構(gòu)中吏夯,對于配置文件,通常有如下的需求

  • 配置文件集中管理
  • 不同環(huán)境不同配置
  • 運行期間可動態(tài)調(diào)整配置

而Spring Cloud Config正是解決這問題的組件裆赵。

本文講從基本配置步驟跺嗽,動態(tài)刷新配置,以及Spring cloud config高可用三個三面講解如何配置Spring cloud config.

配置步驟

如上圖所示份帐,用戶將配置文件push到git倉庫楣导,配置文件按照{application}-{profile}.yml或者{application}-{profile}.properties格式命名筒繁。spring cloud config server連接git倉庫,為所有config client(具體的微服務應用)提供配置服務驮宴。

config client 在配置文件中指向配置中心的地址幻赚。

準備配置文件
創(chuàng)建一個 spring-cloud-config文件夾臊旭,文件夾下創(chuàng)建子文件夾config离熏,在子文件夾下創(chuàng)建以下四個文件,并上傳本地gitlab倉庫中http://gitlab.bill.com/billjiang/spring-cloud-config

  • hello.yml
  • hello-dev.yml
  • hello-test.yml
  • hello-production.yml

創(chuàng)建config server

分別對應默認钻蔑、開發(fā)階段奸鸯、測試階段、生成環(huán)境的配置文件娄涩,并在里面寫入相應的內(nèi)容蓄拣,比如依次寫入profile:defualt-1.0profile:dev-1.0球恤、profile:test-1.0咽斧、profile:production-1.0內(nèi)容,以便后續(xù)測試岭洲。

下面configserver項目為例雁竞,演示spring cloud config的配置碑诉,本文示例代碼參考springcloud-demo下的configserver項目

  • 創(chuàng)建configserver項目进栽,引入如下依賴
 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
 </dependency>
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
   </dependency>

上面的pom.xml不僅引入了config-server還引入了security快毛,主要是配置文件的信息比較重要番挺,加上安全認證多個保障玄柏。

  • 啟動類上加上@EnableConfigServer@EnableDiscoveryClient注解
    這個注解聲明是config server,第二個注解是將其注冊到注冊中心襟衰,方便管理和橫向擴展為集群。
  • 在配置文件中粪摘,加上如下配置
spring:
  cloud:
    config:
      server:
        git:
          uri: http://gitlab.bill.com/billjiang/spring-cloud-config.git
          search-paths: config
          username: billjiang
          password: '{cipher}2c50a112807ec405695dac19c15cc6da280d8d70e9998b82a9f11d202a6fb7b4'
        health:
          repositories:
            a-hello:
              label: master
              name: hello
              profiles: dev
security:
  basic:
    enabled: true
  user:
    name: user
    password: 123456
encrypt:
  key: billjiang

這里對配置文件進行了對稱加密,也可以對放入git倉庫(我在本地搭建了個gitlab)的敏感信息進行加密徘意,對于密文的生成可以在項目啟動后苔悦,使用curl http://user:123456@localhost:8090/encrypt -d [明文] 這樣可以在控制臺生成密文椎咧,比如2c50a112807ec405695dac19c15cc6da280d8d70e9998b82a9f11d202a6fb7b4玖详,把生成的密文加上{cipher}前綴即可作為對稱加密的信息。其中encrypt.key是對稱加密的密鑰勤讽。

需要注意的是:如果使用Dalston.SR2版本的Spring.cloud 在使用curl http://user:123456@localhost:8090/encrypt -d [明文]會報錯,把Spring cloud換成Dalston.SR1就能解決地技,這是Dalston.SR2的一個bug蜈七。

啟動項目后,使用http://localhost:8090/hello/dev可返回如下信息莫矗,說明config server已經(jīng)從git倉庫中讀取了hello-dev.yml的配置信息

啟動spring cloud config.png

在瀏覽器輸入http://localhost:8090/hello-dev.yml還可以在界面輸入配置文件的具體內(nèi)容砂缩。

創(chuàng)建config client
下面以hello項目改造為例庵芭,說下client端如何從config server中獲取配置雀监。

  • 添加依賴
     <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
  • 在配置文件bootstrap.yml中添加如下配置
spring:
  application:
    name: hello
  cloud:
    config:
      uri: http://user:123456@localhost:8090/
      profile: dev
      label: master

之所以不在application.yml中配置好乐,spring boot會優(yōu)先加載bootstrap.yml,不然上下文中無法讀取到配置而報錯。這里指向了config server的地址反璃,并且說明讀取hello-dev.yml的配置,讀取的是master分支假夺。

  • 寫一個測試的列子

    @Value("${profile}")
    private String profile;

    @GetMapping("/profile")
    public String  profile(){
        return this.profile;
    }
  • 啟動hello項目淮蜈,輸入http://localhost:8000/profile即可在界面上看到dev-1.0的輸出。說明客戶端正常讀取了指定的配置文件內(nèi)容已卷。

配置刷新

要在微服務運行期間動態(tài)刷新配置礁芦,可以通過調(diào)用/refresh實現(xiàn),但這樣只能針對單個服務悼尾,而且要手動操作柿扣;如果通過消息中間件,可以將刷新事件廣播到所有相關的微服務闺魏,從而做到自動刷新未状。

調(diào)用/refresh 刷新

  • 引入依賴actuator
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>1.5.6.RELEASE</version>
        </dependency>`
  • 配置文件中增加
endpoints:
  refresh:
    enabled: true
    sensitive: false
  • 修改配置文件hello-dev.yml內(nèi)容,改為dev-1.0-refresh析桥,提交到gitlab中
  • 執(zhí)行curl -X POST http://localhost:8000/refresh 或者用webhook提交該請求
  • 瀏覽器輸入http://localhost:8000/profile查看輸出司草,發(fā)現(xiàn)內(nèi)容已經(jīng)更改為dev-1.0-refresh

使用Spring Cloud Bus自動刷新

借助Spring Cloud Bus,可以將配置變更事件廣播到相關微服務泡仗,從而使得相關微服務能夠自動刷新配置埋虹。

那么刷新的事件可以從單個的服務發(fā)起,這樣可以將配置更新事件廣播到同類服務集群娩怎,如果N個微服務集群要更新服務搔课,那么也要操作N次。而從config server發(fā)起刷新截亦,則所有相關集群自動刷新配置爬泥,后一種明顯更好柬讨。

config-server 配置spring-cloud-bus

  • 引入 spring-cloud-bus
 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
  • 配置文件bootstrap.yml新增
endpoints:
  bus:
    enabled: true
    sensitive: false
spring: 
  rabbitmq:
    host: localhost
    port: 5673
    username: guest
    password: guest
  • 啟動項目configserver
  • 修改配置文件hello-dev.yml內(nèi)容為dev-1.0-bus并提交到gitlab
  • 執(zhí)行curl -X POST http://user:123456@localhost:8090/bus/refresh刷新配置
  • 瀏覽器輸入http://localhost:8000/profile
    發(fā)現(xiàn)內(nèi)容變?yōu)?code>dev-1.0-bus,說明自動化刷新已生效袍啡。

為了更好地測試上述效果踩官,可以通過java -ar hello.jar --server.port=8001java -jar hello.jar --server.port=8002命令將單個微服務配置成集群境输,同時配置其他集群蔗牡。變更多個配置文件后,刷新配置嗅剖,看看是否都更新了辩越。

大家可以按照以上步驟,在單個服務節(jié)點上配置spring cloud bus窗悯,看看刷新配置后区匣,集群中其他節(jié)點的配置是否同步更新了偷拔。

局部刷新

可以通過/bus/refresh?destination=customers:8000,customers:8000是注冊在Eureka Server上的微服務ID蒋院,即ApplicationContextID.

Spring cloud config高可用

作為微服務架構(gòu)中一個十分重要的服務節(jié)點,spring cloud config要保證高可用莲绰,就要避免單點欺旧。這里要分兩種情況,如果cloud server已經(jīng)注冊到Eureka Server蛤签,則僅僅需要多部署幾個cloud server形成集群辞友。如果沒有注冊到Eureka Server,就需要通過負載均衡器震肮,講請求轉(zhuǎn)發(fā)到cloud server集群称龙。

當然,也要保證消息中間件RabbitMQ的高可用戳晌。

以上就是Spring Cloud Config的配置鲫尊。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沦偎,隨后出現(xiàn)的幾起案子疫向,更是在濱河造成了極大的恐慌,老刑警劉巖豪嚎,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搔驼,死亡現(xiàn)場離奇詭異,居然都是意外死亡侈询,警方通過查閱死者的電腦和手機舌涨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扔字,“玉大人泼菌,你說我怎么就攤上這事谍肤。” “怎么了哗伯?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵荒揣,是天一觀的道長。 經(jīng)常有香客問我焊刹,道長系任,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任虐块,我火速辦了婚禮俩滥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贺奠。我一直安慰自己霜旧,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布儡率。 她就那樣靜靜地躺著挂据,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儿普。 梳的紋絲不亂的頭發(fā)上崎逃,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音眉孩,去河邊找鬼个绍。 笑死,一個胖子當著我的面吹牛浪汪,可吹牛的內(nèi)容都是我干的巴柿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼死遭,長吁一口氣:“原來是場噩夢啊……” “哼广恢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起殃姓,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤袁波,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蜗侈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篷牌,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年踏幻,在試婚紗的時候發(fā)現(xiàn)自己被綠了枷颊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖夭苗,靈堂內(nèi)的尸體忽然破棺而出信卡,到底是詐尸還是另有隱情,我是刑警寧澤题造,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布傍菇,位于F島的核電站,受9級特大地震影響界赔,放射性物質(zhì)發(fā)生泄漏丢习。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一淮悼、第九天 我趴在偏房一處隱蔽的房頂上張望咐低。 院中可真熱鬧,春花似錦袜腥、人聲如沸见擦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲤屡。三九已至,卻和暖如春特恬,著一層夾襖步出監(jiān)牢的瞬間执俩,已是汗流浹背徐钠。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工癌刽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尝丐。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓显拜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親爹袁。 傳聞我的和親對象是個殘疾皇子远荠,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容