Spring Cloud Config配置詳解

Spring Cloud Config.png

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

也就是說在微服務(wù)架構(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(具體的微服務(wù)應(yīng)用)提供配置服務(wù)。

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

分別對應(yīng)默認、開發(fā)階段、測試階段、生成環(huán)境的配置文件,并在里面寫入相應(yīng)的內(nèi)容,比如依次寫入profile:defualt-1.0profile:dev-1.0profile:test-1.0profile: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)容。

配置刷新

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

調(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,可以將配置變更事件廣播到相關(guān)微服務(wù),從而使得相關(guān)微服務(wù)能夠自動刷新配置。

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

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命令將單個微服務(wù)配置成集群,同時配置其他集群。變更多個配置文件后,刷新配置,看看是否都更新了。

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

局部刷新

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

Spring cloud config高可用

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

當(dāng)然,也要保證消息中間件RabbitMQ的高可用。

以上就是Spring Cloud Config的配置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,484評論 2 379

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