Spring Cloud 學(xué)習(xí)筆記 - No.3 分布式配置 Config

請(qǐng)先閱讀之前的內(nèi)容:

Spring Cloud Config 介紹

https://cloud.spring.io/spring-cloud-config/

Spring Cloud Config provides server and client-side support for externalized configuration in a distributed system.

Spring Cloud Config 是 Spring Cloud 團(tuán)隊(duì)創(chuàng)建的一個(gè)全新項(xiàng)目,用來(lái)為分布式系統(tǒng)中的基礎(chǔ)設(shè)施和微服務(wù)應(yīng)用提供集中化的和可擴(kuò)展的外部配置支持俭驮。

它分為服務(wù)端與客戶端兩個(gè)部分:

  • 服務(wù)端也稱為分布式配置中心咒精,它是一個(gè)獨(dú)立的微服務(wù)應(yīng)用,用來(lái)連接配置倉(cāng)庫(kù)(例如 Git)并為客戶端提供獲取配置信息、加密/解密信息等訪問(wèn)接口
  • 客戶端則是微服務(wù)架構(gòu)中的各個(gè)微服務(wù)應(yīng)用或基礎(chǔ)設(shè)施驹马,它們通過(guò)指定的配置中心來(lái)管理應(yīng)用資源與業(yè)務(wù)相關(guān)的配置內(nèi)容卷拘,并在啟動(dòng)的時(shí)候從配置中心獲取和加載配置信息。

Spring Cloud Config 實(shí)現(xiàn)了對(duì)服務(wù)端和客戶端中環(huán)境變量 Environment 和屬性配置 PropertySource 的抽象映射氮墨,所以它除了適用于Spring 構(gòu)建的應(yīng)用程序之外纺蛆,也可以在任何其他語(yǔ)言運(yùn)行的應(yīng)用程序中使用。
由于 Spring Cloud Config 實(shí)現(xiàn)的配置中心默認(rèn)采用 Git 來(lái)存儲(chǔ)配置信息规揪,所以使用 Spring Cloud Config構(gòu)建的配置服務(wù)器桥氏,天然就支持對(duì)微服務(wù)應(yīng)用配置信息的版本管理,并且可以通過(guò) Git 客戶端工具來(lái)方便的管理和訪問(wèn)配置內(nèi)容猛铅。當(dāng)然它也提供了對(duì)其他存儲(chǔ)方式的支持字支,比如:SVN倉(cāng)庫(kù)、本地化文件系統(tǒng)。

一個(gè)分布式配置的場(chǎng)景

場(chǎng)景描述:我們有一個(gè)服務(wù)祥款,部署在分布式的環(huán)境上清笨,服務(wù)需要訪問(wèn)數(shù)據(jù)庫(kù)。通常情況下刃跛,我們將數(shù)據(jù)庫(kù)的配置(例如數(shù)據(jù)庫(kù)地址抠艾,用戶名,密碼等等)以文件的形式放置在項(xiàng)目自身的目錄中桨昙。
這樣的問(wèn)題是检号,假如配置發(fā)生了變化(例如數(shù)據(jù)庫(kù)用戶名改變了),我們需要修改配置文件蛙酪,重新 Build齐苛,重新 Deploy。
現(xiàn)在我們嘗試將配置文件放在第三方的位置桂塞,例如 Git凹蜂。然后我們創(chuàng)建一個(gè)配置中心 config-server,它負(fù)責(zé)去 Git 倉(cāng)庫(kù)里讀取文件內(nèi)容阁危。最后其他應(yīng)用程序玛痊,例如之前創(chuàng)建的 eureka-consumer 通過(guò)配置中心 config-server 去讀取配置。
在這里有一個(gè)問(wèn)題狂打,我們只創(chuàng)建了一個(gè)配置中心 config-server擂煞,這樣的話,會(huì)出現(xiàn)單點(diǎn)失敗趴乡,并且負(fù)載均衡得不到保障对省。
因此我們需要?jiǎng)?chuàng)建多個(gè)配置中心,即分布式配置中心晾捏,每一個(gè) config-server 都會(huì)以服務(wù)的形式注冊(cè)到之前創(chuàng)建的服務(wù)注冊(cè)中心 eureka-server 中去蒿涎。
結(jié)構(gòu)如下:該圖引用自 https://blog.csdn.net/fox9916/article/details/79499854/

分布式配置中心

首先我們?cè)?Github 上創(chuàng)建一個(gè) repo,位置:https://github.com/chenxiangcyr/spring-cloud-config-repo-demo惦辛⊥停可以看到,包括三個(gè)不同環(huán)境的配置文件(開發(fā)裙品,測(cè)試,生產(chǎn)):

三個(gè)不同環(huán)境的配置文件

其中一個(gè)文件的內(nèi)容如下 demo-dev.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306
jdbc.username=rootDev
jdbc.password=rootDev

config-server 配置中心

通過(guò)的 Spring Assistant 插件來(lái)創(chuàng)建項(xiàng)目俗或,具體過(guò)程不再贅述市怎。
pom.xml 中導(dǎo)入了如下的依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

隨后在啟動(dòng)程序中通過(guò) @EnableConfigServer 來(lái)開啟 Spring Cloud Config 的服務(wù)端功能。:

@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class ConfigServerApplication {

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

隨后在 application.properties 中添加配置服務(wù)的基本信息以及 Git 倉(cāng)庫(kù)的相關(guān)信息辛慰。

spring.application.name=config-server
server.port=4001

# 服務(wù)注冊(cè)中心
eureka.client.serviceUrl.defaultZone=http://localhost:1234/eureka/

# Git倉(cāng)庫(kù)地址
spring.cloud.config.server.git.uri=https://github.com/chenxiangcyr/spring-cloud-config-repo-demo/

# 如果我們的Git倉(cāng)庫(kù)需要權(quán)限訪問(wèn)区匠,那么可以通過(guò)配置下面的兩個(gè)屬性來(lái)實(shí)現(xiàn)
# spring.cloud.config.server.git.username=
# spring.cloud.config.server.git.password=

# 配置文件所在的目錄
spring.cloud.config.server.git.search-paths=/**

# 配置文件所在的分支
spring.cloud.config.label=master

management.endpoints.web.exposure.include=*

最后我們分別以 4001 和 4002 兩個(gè)端口來(lái)啟動(dòng) config-server 配置中心,可以看到每一個(gè) config-server 都會(huì)以服務(wù)的形式注冊(cè)到之前創(chuàng)建的服務(wù)注冊(cè)中心 eureka-server 中去,點(diǎn)擊 http://127.0.0.1:1234/ 查看如下:

每一個(gè) config-server 都會(huì)以服務(wù)的形式注冊(cè)到之前創(chuàng)建的服務(wù)注冊(cè)中心 eureka-server 中去

隨后我們就可以通過(guò)瀏覽器等工具直接來(lái)訪問(wèn)到我們的配置內(nèi)容了驰弄。訪問(wèn)配置信息的 URL 與配置文件的映射關(guān)系如下:

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

上面的 URL 會(huì)映射{application}-{profile}.properties對(duì)應(yīng)的配置文件麻汰,其中 {label} 對(duì)應(yīng)Git上不同的分支,默認(rèn)為 master戚篙。
例如我們通過(guò) http://127.0.0.1:4001/demo/dev/ 的形式讀取配置文件的具體內(nèi)容:

{
    name: "demo", 
    profiles: [
        "dev"
    ], 
    label: null, 
    version: "92f9ab1bff77011b8ab16f0d2dc7e3f24e326f6d", 
    state: null, 
    propertySources: [
        {
            name: "https://github.com/chenxiangcyr/spring-cloud-config-repo-demo//demo-dev.properties", 
            source: {
                jdbc.driverClassName: "com.mysql.jdbc.Driver", 
                jdbc.url: "jdbc:mysql://127.0.0.1:3306", 
                jdbc.username: "rootDev", 
                jdbc.password: "rootDev"
            }
        }
    ]
}

獲取配置信息

在這里五鲫,我們利用之前創(chuàng)建的項(xiàng)目 eureka-consumer,使得它可以通過(guò)分布式配置中心 config-server 來(lái)讀取配置岔擂。
首先在 pom.xml 中添加了如下的依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

隨后創(chuàng)建 bootstrap.properties 位喂,用來(lái)配置配置中心:

# 開啟配置服務(wù)發(fā)現(xiàn)
spring.cloud.config.enabled=true

# 配置服務(wù)實(shí)例名稱
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server

spring.cloud.config.name=demo
spring.cloud.config.profile=dev
spring.cloud.config.label=master

eureka.client.serviceUrl.defaultZone=http://localhost:1234/eureka/

注意:上面這些屬性必須配置在 bootstrap.properties 中,這樣 config-server 中的配置信息才能被正確加載乱灵。

隨后塑崖,我們創(chuàng)建一個(gè)新的 ReadConfigController 來(lái)通過(guò) @Value 注解的形式讀取配置:

@RestController
public class ReadConfigController {
    private final static Logger logger = LoggerFactory.getLogger(ReadConfigController.class);

    @Value("${jdbc.driverClassName}")
    String driverClassName;

    @Value("${jdbc.url}")
    String url;

    @Value("${jdbc.username}")
    String username;

    @Value("${jdbc.password}")
    String password;

    @GetMapping("/config")
    public String config() {

        logger.info("jdbc.driverClassName = " + driverClassName);
        logger.info("jdbc.url = " + url);
        logger.info("jdbc.username = " + username);
        logger.info("jdbc.password = " + password);

        return "success";
    }
}  

最后,重啟 eureka-consumer痛倚,訪問(wèn)新創(chuàng)建的 Rest 接口 http://127.0.0.1:3001/config规婆,可以在日志中看到,配置被成功讀炔跷取:

配置被成功讀取

推送通知和 Spring Cloud Bus

在上面的示例中抒蚜,有一個(gè)問(wèn)題:我們通過(guò) Git 修改來(lái) demo-dev.properties 文件中的內(nèi)容,但是更新后的內(nèi)容并沒(méi)有被 eureka-consumer 獲取到颠区。

現(xiàn)在我們來(lái)解決這個(gè)問(wèn)題:
許多源代碼存儲(chǔ)庫(kù)提供程序(例如Github削锰,Gitlab 或 Bitbucket)將通過(guò) Webhook 通知您存儲(chǔ)庫(kù)中的更改。
可以通過(guò)提供商的用戶界面將 Webhook 配置為 URL 和一組感興趣的事件毕莱,例如:


設(shè)置 Webhook

設(shè)置 Webhook

流程如下圖所示:引用自 https://blog.csdn.net/mazhen1991/article/details/78513452

推送通知和 Spring Cloud Bus

對(duì)于配置中心 config-server器贩,需要進(jìn)行如下修改
添加如下的依賴到 pom.xml 中:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-monitor</artifactId>
</dependency>

安裝并啟動(dòng)一個(gè) RabbitMQ 實(shí)例,并在 application.properties 中配置 RabbitMQ 連接信息:

spring.rabbitmq.host=127.0.0.1
啟動(dòng)兩個(gè) config-server 實(shí)例連接到 RabbitMQ

對(duì)于 eureka-consumer朋截,需要進(jìn)行如下修改
添加如下的依賴到 pom.xml 中:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

application.properties 中配置 RabbitMQ 連接信息:

spring.rabbitmq.host=127.0.0.1

拓展閱讀


引用:
程序猿DD Spring Cloud基礎(chǔ)教程
Spring Cloud構(gòu)建微服務(wù)架構(gòu):分布式配置中心【Dalston版】
Spring Cloud Dalston中文文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛹稍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子部服,更是在濱河造成了極大的恐慌唆姐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廓八,死亡現(xiàn)場(chǎng)離奇詭異奉芦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剧蹂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門声功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人宠叼,你說(shuō)我怎么就攤上這事先巴。” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵伸蚯,是天一觀的道長(zhǎng)摩渺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)剂邮,這世上最難降的妖魔是什么摇幻? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮抗斤,結(jié)果婚禮上囚企,老公的妹妹穿的比我還像新娘。我一直安慰自己瑞眼,他們只是感情好龙宏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伤疙,像睡著了一般银酗。 火紅的嫁衣襯著肌膚如雪昼接。 梳的紋絲不亂的頭發(fā)上窥浪,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音薪丁,去河邊找鬼锯蛀。 笑死灭衷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旁涤。 我是一名探鬼主播翔曲,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼劈愚!你這毒婦竟也來(lái)了瞳遍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤菌羽,失蹤者是張志新(化名)和其女友劉穎掠械,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體注祖,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猾蒂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了是晨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婚夫。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖署鸡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤靴庆,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布时捌,位于F島的核電站,受9級(jí)特大地震影響炉抒,放射性物質(zhì)發(fā)生泄漏奢讨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一焰薄、第九天 我趴在偏房一處隱蔽的房頂上張望拿诸。 院中可真熱鬧,春花似錦塞茅、人聲如沸亩码。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)描沟。三九已至,卻和暖如春鞭光,著一層夾襖步出監(jiān)牢的瞬間吏廉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工惰许, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留席覆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓汹买,卻偏偏與公主長(zhǎng)得像佩伤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卦睹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理畦戒,服務(wù)發(fā)現(xiàn),斷路器结序,智...
    卡卡羅2017閱讀 134,661評(píng)論 18 139
  • 前言 Spring Cloud Config是Spring Cloud團(tuán)隊(duì)創(chuàng)建的一個(gè)全新項(xiàng)目障斋,用來(lái)為分布式系統(tǒng)中的...
    Chandler_玨瑜閱讀 4,914評(píng)論 9 27
  • 上一篇:《Spring Cloud入門教程(七):分布式鏈路跟蹤(Sleuth)》 本人和同事撰寫的《Spring...
    CD826閱讀 16,028評(píng)論 6 28
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • 這次回老家來(lái),多次夢(mèng)到他徐鹤,最近幾天更是幾乎每晚都在夢(mèng)中相見垃环,時(shí)而甜蜜,時(shí)而悲傷返敬,昨夜他竟然告訴我:以后別再去找他了...
    輕輕一縷煙閱讀 414評(píng)論 0 1