Spring Cloud筆記(7)使用Consul作為配置中心

Spring Boot應(yīng)用最大的特點(diǎn)就是使用配置來(lái)代替編碼剂买,很多時(shí)候啟用某一個(gè)功能只需要引入相關(guān)的starter贱呐,再加入對(duì)應(yīng)的配置項(xiàng)就可以了弃秆,例如數(shù)據(jù)源届惋,安全性,中間件等等菠赚。對(duì)于單個(gè)項(xiàng)目脑豹,我們一般會(huì)把配置項(xiàng)放到application.property或者application.yaml中,在不同的環(huán)境中替換相應(yīng)的配置值就可以了衡查。但在Spring Cloud項(xiàng)目中瘩欺,因?yàn)橐胛⒎?wù)概念,導(dǎo)致整個(gè)系統(tǒng)的服務(wù)實(shí)例會(huì)大大增加拌牲,這樣如果系統(tǒng)新增了一個(gè)配置項(xiàng)俱饿,還像以前那樣逐個(gè)去手工替換配置文件,運(yùn)維人員估計(jì)要累到吐血塌忽。而且傳統(tǒng)的方式還有一個(gè)問(wèn)題拍埠,替換配置文件以后必須要重啟整個(gè)服務(wù),這對(duì)于部分應(yīng)用來(lái)說(shuō)也是不可接受的土居。

我們之前在介紹Consul的時(shí)候枣购,提到了Consul除了提供服務(wù)的注冊(cè)/發(fā)現(xiàn)功能以外嬉探,還提供了key/value的存儲(chǔ)功能,而且Consul可以提供對(duì)存儲(chǔ)鍵值對(duì)的CP(強(qiáng)一致性棉圈,類(lèi)似于zookeeper)保證涩堤,這樣我們就可以利用Consul來(lái)實(shí)現(xiàn)統(tǒng)一配置中心的相關(guān)功能了(Spring Cloud Config 組件也提供基于GIT或SVN的配置中心解決方案)。Spring Cloud 已經(jīng)為Consul配置中心提供相關(guān)的實(shí)現(xiàn)框架 — spring-cloud-starter-consul-config分瘾。我們只需要在每個(gè)服務(wù)模塊中加入相關(guān)的依賴(lài):

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

然后在resources目錄中新增一個(gè)配置文件bootstrap.yml定躏,用于配置遠(yuǎn)程配置中心的相關(guān)信息:

spring:
  cloud:
    consul:
      host: 192.168.1.220
      port: 8500
      discovery:
        prefer-ip-address: true
      config:
        enabled: true
        prefix: config
        default-context: application
        profile-separator: ','
        data-key: data
        format: yaml

這個(gè)bootstrap.yml是spring boot的引導(dǎo)配置文件,其加載優(yōu)先級(jí)高于其它任何配置芹敌,是在一個(gè)獨(dú)立的父級(jí)上下文(Bootstrap Context)中加載解析的。與配置中心相關(guān)的配置都應(yīng)該放到該配置文件之中垮抗,才能夠?qū)崿F(xiàn)初始化應(yīng)用程序之前先到配置中心去抓取必要的配置氏捞。spring.cloud.consul.config的相關(guān)配置項(xiàng)意義如下:

  • enabled: 是否啟用consul配置中心
  • prefix: 配置項(xiàng)在consul中的根目錄,默認(rèn)是config
  • default-context: 所有服務(wù)的公共配置所在的配置目錄冒版,默認(rèn)是application
  • profile-separator: 配置項(xiàng)目錄中profile名稱(chēng)的分隔符液茎,默認(rèn)是 “,”
  • data-key:配置項(xiàng)的key名稱(chēng),默認(rèn)是data
  • format:配置項(xiàng)的值的文件格式

比如按照以上的配置辞嗡,如果spring.application.name設(shè)置為order-service捆等,spring.profiles.active為dev的服務(wù)啟動(dòng)后默認(rèn)會(huì)去consul的key/value目錄的以下四個(gè)位置去查找配置信息,配置的key為data续室,值必須為yaml格式:

  • config/application,dev/:公共配置信息栋烤,profile為dev
  • config/application/:公共配置信息
  • config/order-service,dev/:order-service服務(wù)的專(zhuān)屬配置信息,profile為dev
  • config/order-service/:order-service服務(wù)的專(zhuān)屬配置信息

現(xiàn)在我們?cè)趏rder-service服務(wù)上測(cè)試一下挺狰,首先在consul的config/application/和config/order-service/目錄分別加入兩個(gè)配置項(xiàng):


專(zhuān)屬配置.png
通用配置.png

然后添加一個(gè)測(cè)試的ConfigController 明郭,測(cè)試配置項(xiàng)的注入:

@RestController
@RequestMapping("/api/config")
@Slf4j
public class ConfigController {

    @Value("${global-config.key1}")
    private String key1;

    @Value("${service-config.key2}")
    private String key2;

    @GetMapping("/test-config-center")
    public void testConfigCenter() {
        log.info("global-config.key1:{},service-config.key2:{}", key1, key2);
    }

}

訪問(wèn) http://localhost:9001/api/config/test-config-center 就可以看到控制臺(tái)輸出了對(duì)應(yīng)的配置值:

2020-04-27 11:18:19.505  INFO 15828 --- [nio-9001-exec-9] c.g.d.s.o.controller.Controller          : global-config.key1:value1,service-config.key2:value2

我們?cè)賮?lái)測(cè)試一下配置項(xiàng)的動(dòng)態(tài)更新。為了支持動(dòng)態(tài)更新配置參數(shù)丰泊,我們需要在注入?yún)?shù)的Spring Component上加入一個(gè)@RefreshScope注解薯定,這樣才能在參數(shù)更新后刷新當(dāng)前的scope:

@RestController
@RequestMapping("/api/config")
@Slf4j
@RefreshScope
public class ConfigController

然后在consul ui中修改配置項(xiàng)的值,將global-config.key1的值修改為:modified-value瞳购,保存后再次訪問(wèn)http://localhost:9001/api/config/test-config-center话侄,可以看到控制臺(tái)打印出的屬性值已經(jīng)是我們修改后的最新的結(jié)果了:

2020-04-27 11:45:01.978  INFO 16368 --- [TaskScheduler-1] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-config/order-service/'}, BootstrapPropertySource {name='bootstrapProperties-config/application/'}]
LOGBACK: No context given for c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@2107186835
2020-04-27 11:45:01.992  INFO 16368 --- [TaskScheduler-1] o.s.boot.SpringApplication               : No active profile set, falling back to default profiles: default
2020-04-27 11:45:02.009  INFO 16368 --- [TaskScheduler-1] o.s.boot.SpringApplication               : Started application in 0.694 seconds (JVM running for 70.244)
2020-04-27 11:45:02.150  INFO 16368 --- [TaskScheduler-1] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [global-config.key1]
2020-04-27 11:45:14.614  INFO 16368 --- [io-9001-exec-10] c.g.d.s.o.controller.ConfigController    : global-config.key1:modified-value,service-config.key2:value2

其實(shí)配置項(xiàng)的動(dòng)態(tài)刷新是通過(guò)不斷的輪詢(xún)Consul的HTTP API,檢測(cè)相關(guān)的配置目錄是否發(fā)生了變化來(lái)實(shí)現(xiàn)的学赛,輪詢(xún)的間隔時(shí)間可以通過(guò)spring.cloud.consul.config.watch.delay來(lái)配置年堆,默認(rèn)是1000毫秒,如果不想啟用自動(dòng)刷新機(jī)制罢屈,可以配置spring.cloud.consul.config.watch.enabled=false

本文的相關(guān)代碼可以查看這里 spring-cloud-demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嘀韧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缠捌,更是在濱河造成了極大的恐慌锄贷,老刑警劉巖译蒂,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谊却,居然都是意外死亡柔昼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)炎辨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捕透,“玉大人,你說(shuō)我怎么就攤上這事碴萧∫亦郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵破喻,是天一觀的道長(zhǎng)虎谢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)曹质,這世上最難降的妖魔是什么婴噩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮羽德,結(jié)果婚禮上几莽,老公的妹妹穿的比我還像新娘。我一直安慰自己宅静,他們只是感情好章蚣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著坏为,像睡著了一般究驴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匀伏,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天洒忧,我揣著相機(jī)與錄音,去河邊找鬼够颠。 笑死熙侍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的履磨。 我是一名探鬼主播蛉抓,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剃诅!你這毒婦竟也來(lái)了巷送?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矛辕,失蹤者是張志新(化名)和其女友劉穎笑跛,沒(méi)想到半個(gè)月后付魔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飞蹂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年几苍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陈哑。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妻坝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惊窖,到底是詐尸還是另有隱情刽宪,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布界酒,位于F島的核電站纠屋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盾计。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一赁遗、第九天 我趴在偏房一處隱蔽的房頂上張望署辉。 院中可真熱鬧,春花似錦岩四、人聲如沸哭尝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)材鹦。三九已至,卻和暖如春耕姊,著一層夾襖步出監(jiān)牢的瞬間桶唐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工茉兰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尤泽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓规脸,卻偏偏與公主長(zhǎng)得像坯约,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子莫鸭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • 原文: Consul基本使用date: 2019-05-13 17:01:37 [TOC] 前言 官網(wǎng)介紹Cons...
    i蝸居年華_謝謝謝閱讀 21,160評(píng)論 0 10
  • 上一篇:《Spring Cloud入門(mén)教程(七):分布式鏈路跟蹤(Sleuth)》 本人和同事撰寫(xiě)的《Spring...
    CD826閱讀 16,013評(píng)論 6 28
  • 微服務(wù)架構(gòu)模式的核心在于如何識(shí)別服務(wù)的邊界闹丐,設(shè)計(jì)出合理的微服務(wù)。但如果要將微服務(wù)架構(gòu)運(yùn)用到生產(chǎn)項(xiàng)目上被因,并且能夠發(fā)揮...
    java菜閱讀 2,949評(píng)論 0 6
  • 工作中卿拴,我是一名活動(dòng)策劃衫仑,公司大大小小的活動(dòng)規(guī)劃、形成巍棱、乃至流程惑畴,都要經(jīng)由我的手中發(fā)出。每當(dāng)一個(gè)活動(dòng)在經(jīng)過(guò)了海...
    茶與人生閱讀 386評(píng)論 1 2
  • 有兩個(gè)消息要告訴你航徙,一個(gè)好消息一個(gè)壞消息你想聽(tīng)哪個(gè)如贷?好消息是母親節(jié)快到了,我給你買(mǎi)了條褲子到踏,一會(huì)兒就會(huì)給你打電話領(lǐng)...
    做個(gè)優(yōu)秀的女孩閱讀 136評(píng)論 0 1