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

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

我們之前在介紹Consul的時候,提到了Consul除了提供服務(wù)的注冊/發(fā)現(xiàn)功能以外,還提供了key/value的存儲功能,而且Consul可以提供對存儲鍵值對的CP(強(qiáng)一致性,類似于zookeeper)保證,這樣我們就可以利用Consul來實(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。我們只需要在每個服務(wù)模塊中加入相關(guān)的依賴:

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

然后在resources目錄中新增一個配置文件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

這個bootstrap.yml是spring boot的引導(dǎo)配置文件,其加載優(yōu)先級高于其它任何配置,是在一個獨(dú)立的父級上下文(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名稱的分隔符,默認(rèn)是 “,”
  • data-key:配置項(xiàng)的key名稱,默認(rèn)是data
  • format:配置項(xiàng)的值的文件格式

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

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

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


專屬配置.png
通用配置.png

然后添加一個測試的ConfigController ,測試配置項(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);
    }

}

訪問 http://localhost:9001/api/config/test-config-center 就可以看到控制臺輸出了對應(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

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

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

然后在consul ui中修改配置項(xiàng)的值,將global-config.key1的值修改為:modified-value,保存后再次訪問http://localhost:9001/api/config/test-config-center,可以看到控制臺打印出的屬性值已經(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)的動態(tài)刷新是通過不斷的輪詢Consul的HTTP API,檢測相關(guān)的配置目錄是否發(fā)生了變化來實(shí)現(xiàn)的,輪詢的間隔時間可以通過spring.cloud.consul.config.watch.delay來配置,默認(rèn)是1000毫秒,如果不想啟用自動刷新機(jī)制,可以配置spring.cloud.consul.config.watch.enabled=false

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容