Spring Cloud 學(xué)習(xí)教程——第六篇:統(tǒng)一配置中心(Spring Cloud Config)

一浮还、簡(jiǎn)介

在分布式系統(tǒng)中竟坛,由于服務(wù)數(shù)量巨多,為了方便服務(wù)配置文件統(tǒng)一管理碑定,實(shí)時(shí)更新流码,所以需要分布式配置中心組件。在Spring Cloud中延刘,有分布式配置中心組件spring cloud config 漫试,它支持配置服務(wù)放在配置服務(wù)的內(nèi)存中(即本地),也支持放在遠(yuǎn)程Git倉(cāng)庫(kù)中碘赖。在spring cloud config 組件中驾荣,分兩個(gè)角色,一是config server普泡,二是config client播掷。

隨著線上項(xiàng)目變的日益龐大,每個(gè)項(xiàng)目都散落著各種配置文件撼班,如果采用分布式的開發(fā)模式歧匈,需要的配置文件隨著服務(wù)增加而不斷增多。某一個(gè)基礎(chǔ)服務(wù)信息變更砰嘁,都會(huì)引起一系列的更新和重啟件炉,運(yùn)維苦不堪言也容易出錯(cuò)勘究。配置中心便是解決此類問題的靈丹妙藥。

市面上開源的配置中心有很多斟冕,BAT每家都出過(guò)口糕,360的QConf、淘寶的diamond磕蛇、百度的disconf都是解決這類問題景描。國(guó)外也有很多開源的配置中心Apache的Apache Commons Configuration、owner秀撇、cfg4j等等超棺。

二、配置中心提供的核心功能

  • 提供服務(wù)端和客戶端支持
  • 集中管理各環(huán)境的配置文件
  • 配置文件修改之后捌袜,可以快速的生效
  • 可以進(jìn)行版本管理
  • 支持大的并發(fā)查詢
  • 支持各種語(yǔ)言

Spring Cloud Config可以完美的支持以上所有的需求说搅。

Spring Cloud Config項(xiàng)目是一個(gè)解決分布式系統(tǒng)的配置管理方案炸枣。它包含了Client和Server兩個(gè)部分虏等,server提供配置文件的存儲(chǔ)、以接口的形式將配置文件的內(nèi)容提供出去适肠,client通過(guò)接口獲取數(shù)據(jù)霍衫、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用。Spring cloud使用git或svn存放配置文件侯养,默認(rèn)情況下使用git敦跌,我們以git為例。

首先在github上面創(chuàng)建了一個(gè)文件夾 config-files用來(lái)存放配置文件逛揩,為了模擬生產(chǎn)環(huán)境柠傍,我們創(chuàng)建以下三個(gè)配置文件:

// 開發(fā)環(huán)境
mengma-config-dev.yml
// 測(cè)試環(huán)境
mengma-config-test.yml
// 生產(chǎn)環(huán)境
mengma-config-pro.yml

每個(gè)配置文件中都寫一個(gè)屬性 hello ,屬性值分別是 mengma.....dev / mengma.....test / mengma.....pro 辩稽。下面我們開始配置config server 端惧笛。

config server 端代碼編寫

  • 新建項(xiàng)目,引入依賴逞泄,只需要引入 config -server 就可以 患整,不需要引入 eureka-client ,web

config-server

  • 配置配置文件
server:
  port: 8778
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/***    #  配置git倉(cāng)庫(kù)的地址
          search-paths: config-files  # git倉(cāng)庫(kù)地址下的相對(duì)地址喷众,可以配置多個(gè)各谚,用,分割。
          username:  ***                                            # git倉(cāng)庫(kù)的賬號(hào)
          password:   ****                                           # git倉(cāng)庫(kù)的密碼
  • 啟動(dòng)類添加注解
@SpringBootApplication
// 聲明為 config server 端
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}
  • 測(cè)試config server 是否生效

首先我們先要測(cè)試server端是否可以讀取到github上面的配置信息到千,直接訪問:http://localhost:8778/mengma-config/dev

返回信息如下:

{
    "name": "mengma-config", 
    "profiles": [
        "dev"
    ], 
    "label": null, 
    "version": null, 
    "state": null, 
    "propertySources": [
        {
            "name": "https://github.com/****/config-files/mengma-config-dev.yml", 
            "source": {
                "hello": "mengma.....dev"
            }
        }
    ]
}

上述的返回的信息包含了配置文件的位置昌渤、版本、配置文件的名稱以及配置文件中的具體內(nèi)容憔四,說(shuō)明server端已經(jīng)成功獲取了git倉(cāng)庫(kù)的配置信息膀息。

如果直接查看配置文件中的配置信息可訪問:http://localhost:8778/mengma-config-dev.yml望抽,
返回:

hello: mengma.....dev

修改配置文件mengma-config-dev.yml中配置信息為:hello: mengma.....dev update,再次在瀏覽器訪問http://localhost:8778/mengma-config-dev.yml,返回:

hello: mengma.....dev update履婉、

說(shuō)明 server 端會(huì)自動(dòng)讀取最新提交的內(nèi)容煤篙。

倉(cāng)庫(kù)中的配置文件會(huì)被轉(zhuǎn)換成web接口,訪問可以參照以下的規(guī)則:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

以config-server-dev.yml為例子毁腿,它的 applicationconfig-server辑奈,profiledev,client會(huì)根據(jù)填寫的參數(shù)來(lái)選擇讀取對(duì)應(yīng)的配置已烤。

label?.....

以config-server-dev.yml為例子鸠窗,它的application是config-server,profile是dev胯究。client會(huì)根據(jù)填寫的參數(shù)來(lái)選擇讀取對(duì)應(yīng)的配置稍计。

client 端

主要展示如何在業(yè)務(wù)項(xiàng)目中去獲取server端的配置信息。

  • 添加依賴
    spring-cloud-starter-config
    spring-boot-starter-web
    spring-boot-starter-test

  • 配置文件

需要配置兩個(gè)配置文件裕循,application.properties和bootstrap.properties(文件加載優(yōu)先權(quán))
application.properties如下:

spring.application.name=spring-cloud-config-client
server.port=8002

bootstrap.properties如下:

spring.application.name=config-client
spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:xxxx/
server.port=8881
  • spring.cloud.config.label 指明遠(yuǎn)程倉(cāng)庫(kù)的分支
  • spring.cloud.config.profile
    dev開發(fā)環(huán)境配置文件
    test測(cè)試環(huán)境
    pro正式環(huán)境
  • spring.cloud.config.uri= http://localhost:8888/ 指明配置服務(wù)中心的網(wǎng)址臣嚣。

程序的入口類,寫一個(gè)API接口“/hi”剥哑,返回從配置中心讀取的 hello 變量的值硅则,代碼如下:

@SpringBootApplication
@RestController
public class ConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }

    @Value("${hello}")
    String hello;
    @RequestMapping(value = "/hi")
    public String hi(){
        return hello;
    }
}

打開網(wǎng)址訪問:http://localhost:8881/hi,網(wǎng)頁(yè)顯示:

mengma.....dev

這就說(shuō)明株婴,config-client從config-server獲取了foo的屬性怎虫,而config-server是從git倉(cāng)庫(kù)讀取的,如圖:

配置中心服務(wù)高可用

客戶端都是直接調(diào)用配置中心的server端來(lái)獲取配置文件信息。這樣就存在了一個(gè)問題困介,客戶端和服務(wù)端的耦合性太高乔遮,如果server端要做集群鲫凶,客戶端只能通過(guò)原始的方式來(lái)路由峦椰,server端改變IP地址的時(shí)候趣席,客戶端也需要修改配置,不符合springcloud服務(wù)治理的理念八回。springcloud提供了這樣的解決方案酷愧,我們只需要將server端當(dāng)做一個(gè)服務(wù)注冊(cè)到eureka中,client端去eureka中去獲取配置中心server端的服務(wù)既可缠诅。

這篇文章我們基于配置中心git版本的內(nèi)容來(lái)改造溶浴。

server 端改造

  • 添加依賴

添加 eureka-client 依賴,來(lái)添加對(duì)eureka 的支持管引。

  • 配置文件
server:
server:
  port: 8001
spring:
  application:
    name: spring-cloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/***/spring-cloud-starter/     # 配置git倉(cāng)庫(kù)的地址
          search-paths: config-repo                             # git倉(cāng)庫(kù)地址下的相對(duì)地址士败,可以配置多個(gè),用,分割。
          username: username                                        # git倉(cāng)庫(kù)的賬號(hào)
          password: password                                    # git倉(cāng)庫(kù)的密碼
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8000/eureka/   ## 注冊(cè)中心eurka地址

增加了eureka注冊(cè)中心的配置谅将。

這樣server端的改造就完成了漾狼。先啟動(dòng)eureka注冊(cè)中心,在啟動(dòng)server端饥臂,在瀏覽器中訪問:http://localhost:xxxx/ 就會(huì)看到server端已經(jīng)注冊(cè)了到注冊(cè)中心了逊躁。

客戶端改造

  • 依賴添加
    添加 eureka-client

  • 配置文件

spring:
  cloud:
    config:
      discovery:
        serviceId: spring-cloud-config-server
        enabled: true
      profile: dev
      name: neo-config
      label: master
  application:
    name: spring-cloud-config-client

server:
  port: 8002

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8000/eureka/

主要是去掉了spring.cloud.config.uri直接指向server端地址的配置,增加了最后的三個(gè)配置:

spring.cloud.config.discovery.enabled :開啟Config服務(wù)發(fā)現(xiàn)支持
spring.cloud.config.discovery.serviceId :指定server端的name,也就是server端spring.application.name的值
eureka.client.serviceUrl.defaultZone :指向配置中心的地址

這三個(gè)配置文件都需要放到bootstrap.yml的配置中隅熙。

啟動(dòng)client端稽煤,在瀏覽器中訪問:http://localhost:xxxx/ 就會(huì)看到server端和client端都已經(jīng)注冊(cè)了到注冊(cè)中心了。

高可用

為了模擬生產(chǎn)集群環(huán)境囚戚,我們改動(dòng)server端的端口為8003酵熙,再啟動(dòng)一個(gè)server端來(lái)做服務(wù)的負(fù)載,提供高可用的server端支持驰坊。

如上圖就可發(fā)現(xiàn)會(huì)有兩個(gè)server端同時(shí)提供配置中心的服務(wù)匾二,防止某一臺(tái)掛掉之后影響整個(gè)系統(tǒng)的使用。

我們先單獨(dú)測(cè)試服務(wù)端拳芙,分別訪問:http://localhost:8001/neo-config/dev察藐、http://localhost:8003/neo-config/dev返回信息:

再次訪問:http://localhost:8002/hello,返回:mengma.....dev update态鳖。說(shuō)明客戶端已經(jīng)讀取到了server端的內(nèi)容转培,我們隨機(jī)停掉一臺(tái)server端的服務(wù),再次訪問http://localhost:8002/hello浆竭,返回:mengma.....dev update,說(shuō)明達(dá)到了高可用的目的惨寿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邦泄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子裂垦,更是在濱河造成了極大的恐慌顺囊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕉拢,死亡現(xiàn)場(chǎng)離奇詭異特碳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晕换,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門午乓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人闸准,你說(shuō)我怎么就攤上這事益愈。” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蒸其,是天一觀的道長(zhǎng)敏释。 經(jīng)常有香客問我,道長(zhǎng)摸袁,這世上最難降的妖魔是什么钥顽? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮靠汁,結(jié)果婚禮上耳鸯,老公的妹妹穿的比我還像新娘。我一直安慰自己膀曾,他們只是感情好县爬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著添谊,像睡著了一般财喳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斩狱,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天耳高,我揣著相機(jī)與錄音,去河邊找鬼所踊。 笑死泌枪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秕岛。 我是一名探鬼主播碌燕,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼继薛!你這毒婦竟也來(lái)了修壕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤遏考,失蹤者是張志新(化名)和其女友劉穎慈鸠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灌具,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡青团,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咖楣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片督笆。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖截歉,靈堂內(nèi)的尸體忽然破棺而出胖腾,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布咸作,位于F島的核電站锨阿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏记罚。R本人自食惡果不足惜墅诡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桐智。 院中可真熱鬧末早,春花似錦、人聲如沸说庭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刊驴。三九已至姿搜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捆憎,已是汗流浹背舅柜。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躲惰,地道東北人致份。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像础拨,于是被迫代替她去往敵國(guó)和親氮块。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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