spring cloud consul config小demo遇到的問題

最近公司想讓我看看微服務html

正好我也想看看新東西,每天解決業務問題。。。太沒有激情了。。。並且咱們大多應用都仍是springmvcspringboot的應用都不多,只有幾個,唉,我也是深陷業務問題中spring

Spring Cloud也算是一個全家桶吧,裏面東西也多,不過從感受開箱即用的原則來看,用起來也比較順手,demo也都很好搭建,
從開始的網關+服務的着手,網關我採用的Zuul,服務治理採用的eureka,後面想用spring cloud config做爲配置中心,可是還要本身搭一個server非常麻煩。。。我也懶。。。無心聽同事說,其實全家桶裏服務治理能夠用spring cloud consul,而consul就自帶一個配置功能,因而我去了解了spring cloud consul config
spring cloud consul config自己依賴spring cloud consulagent server,因此只要agent server啓動了,其實就至關於有了一個server來作配置,我滿心歡喜的把服務治理eureka改成spring cloud consul,嗖嗖兩下,spring cloud consul也配置好了
命令行裏執行了,啓動測試模式的agent server數據庫

consul agent -dev

打開localhost:8500, 很明顯有了一個相似配置中心的菜單bootstrap

clipboard.png

點開進去啥也沒有。。。只有右邊一個建立按鈕springboot

clipboard.png

也沒灰心,我先是去官網介紹看了看 官網連接描述mvc

clipboard.png

我認可我英語是差了。。。看了半天,我真是沒看明白怎麼使用。。。當時我有點懵逼,說好的很好操做的呢
沒辦法,我只有去百度了哈,看了不少文章,基本全部文章說的都是差不太多,可是這個差不太多又都沒有說清楚到底怎麼玩。。。
好吧,這個時候我有點認可我本身理解能力有點問題了,心想既然你們都沒有說清楚,估計應該就是很容易理解,因此你們心領神會,我又反覆讀了哈官方的描述,而且找了springcloud.cc裏的中文說明文檔,仍是沒看太懂。。。app

clipboard.png

當時我真的以爲有點懵了。。。心想今天算了仍是不想這個,明天再想,因而我去把demo的網關換成了spring cloud gateway,這個基本沒有半個小時就搞定了,仍是比較簡單的spring-boot

次日也就是今天,我再次來看了哈文檔,百度的幾篇文章除了說明了一點,要加一個配置文件bootstrap.yml,這裏面要去指定一些spring cloud consul config的一些配置,而且意思感受是application.yml裏的配置均可以不用寫了,徹底維護在spring cloud consul config裏,可是spring cloud consul config到底在哪,我仍是沒法把須要配置的屬性,application.ymlconsul agent裏剛一片空白的配置頁面,這三者聯繫起來微服務

終於無心中,我發現有一篇文章的一句話讓我警醒了。。。他不是像其餘文章說一些貌似你們都懂的話,而是很是鄭重了說了一句測試

clipboard.png

感受這難道也是一個理解能力和我差很少,可是比我強的人麼。。。他這麼一句讓我明白,確實官網說的也不太明白,最後那句體會一下,我再去反覆看了文章,和本身試驗。。。

終於懂了。。。

懂了以後再回過頭來看,spring cloud consul config仍是真的真的很是簡單的。。。其實就是想要用spring cloud consul config,你要和它的一些約定或者說它的規範匹配起就完事了,剩下就跟普通的配置文件同樣了,接下來我用我本身的理解來講明哈spring cloud consul config怎麼使用,固然前提你對於服務治理consul有點點了解哈

spring cloud consul config其實就是一個服務的配置中心,配置統一管理的地方,你哪一個服務須要這個配置中心,你就在那個服務里加上依賴

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

以後在該服務的resources目錄下新增一個bootstrap.yml文件,裏面加上這些就夠了

spring:
  cloud:
    consul:
      config:
        format: yaml
        default-context: gateway

format默認是key_value的形式,可是我如今很喜歡用yaml形式的配置文件,default-context根據你的應用取吧,相似與spring.application.name屬性同樣,區分服務的

完事以後,在consul agent剛那個頁面裏建立一個目錄,對,是目錄,目錄名必定要像這樣config/gateway/data

clipboard.png

也就是configdata目錄都是默認值,你沒有配置的時候,就不用管,可是你必須這麼寫,中間那個gateway就是剛那個 default-context,這樣consul agent頁面和bootstrap.xml就映射起來了,接下來你就能夠在下面的value裏像yaml文件一下寫配置了

clipboard.png

固然你想改目錄的兩個默認值,你就能夠這麼修改了,對應prefixdata-key,把默認值寫出來就一眼清楚了

spring:
  cloud:
    consul:
      config:
        format: yaml
        default-context: gateway
        prefix: config
        data-key: data

因此仍是簡單的,固然還有個問題,要是多個環境的不一樣配置怎麼來的,嘿嘿,這是個關鍵問題,由於這個處理,讓我實在沒有想到,通常咱們不用配置中心的時候,在工程裏配置,能夠按照application-test.ymlapplication-prod.yml來區分環境,這個spring cloud consul config也是能夠的,不過不是建立config/gateway/data/test,亦或是config/gateway/data/prod這種。。。天真

特麼居然是config/gateway,test/dataconfig/gateway,data/data,沒錯,你沒有看錯,服務名和環境中間用逗號分開。。。

並且這個中間分隔符逗號仍是支持可配。。。默認是逗號。。。你還能夠用屬性profile-separator進行修改

spring:
  cloud:
    consul:
      config:
        format: yaml
        default-context: gateway
        prefix: config
        data-key: data
        profile-separator: ','

可能我是一個比較傳統的程序猿。。。這種逗號分開的目錄命名方式對我來講仍是有點衝擊的。。。再回過頭看官方的文檔,也算是有點明白了。。。真的仍是個人理解能力太差

clipboard.png

總得來講也是怪本身太着急了。。。以前幾個開箱即用的把本身搞的浮躁了點。。其實仔細看文檔仍是能看明白的。。。

最後你能夠像日常寫配置文件一下,這麼根據環境來配置了

clipboard.png

總結哈:戒驕戒躁吧。。。

----------------------------------------------------------------------華麗的分割線------------------------------------

這裏簡單說哈@FengSufeier 的疑問,從你提到

clipboard.png

因此估計你多是自學尚未走入正式的工做場景中吧,我能夠給你舉個例子,在咱們平常開發過程當中,好比你如今有一個系統,有一個項目工程代碼,裏面有數據庫配置,你正式上線的環境確定有一個數據庫的地址,你測試環境也會有一個數據庫的地址,兩個確定不同,否則現網數據和測試數據混在一塊兒,或者有關聯的話,測試環境數據庫被測掛了,那現網數據庫也就遭殃了,因此通常是分開的,這也就分了兩個環境,可是代碼是一份,數據庫配置是分兩份的,如何控制?

這個時候,咱們通常就是把以前的一個配置文件application.yml分爲application-test.ymlapplication-prod.yml兩份,而這application-test.ymlapplication-prod.yml這兩個文件去配置不一樣環境的數據庫,固然這裏叫testprod,你也能夠叫其餘名字,只是一個叫法,而後在啓動的時候,添加虛擬機的啓動參數(VM options):-Dspring.profiles.active=test,也就是告訴SpringBoot你須要執行哪一個配置環境的配置文件

clipboard.png

這一點在boot說明文檔裏有提到,同時指定環境的配置文件執行時會把application.yml中的配置覆蓋掉
clipboard.png

這樣也很好,好比你有3個配置文件application.ymlapplication-test.yml,application-prod.yml,你能夠把不一樣環境的配置放入後兩個文件,可是一些公共的業務屬性配置,不區分環境的配置就能夠放到application.yml

以上回答了你的devtest的用途,用法是什麼,總結一下

  1. devtest就是不一樣環境的名字,怎麼取看你
  2. 爲何要這麼作,就是實際開發中有一些配置必需要分兩份,或更多份以示區分,同一個項目要在不一樣配置下運行
  3. 怎麼用,其實就是根據你的要求按照application-{profile}.yml的方式區分配置,而後啓動的時候添加-Dspring.profiles.active=test來指定你要運行的環境

可是說了這麼多,並無說到任何Consul Config,對,由於本質就是兩個問題,Spring Cloud Consul Config自己是爲了解決多系統,多應用的配置管理問題,它是統一管理配置的地方,而且能夠作到動態刷新

結合以前說到的多環境須要配置不一樣的配置文件,那既然如今要把全部配置都放到Consul Config上作統一管理,那其實Consul Config也要支持多環境了,因此纔有config/gateway,dev/data這樣的寫法,只是Consul Config的一個規定,以便支持多環境而已

至於你提到了修改爲了config/gateway,dev/data以後的配置不起做用了,按照剛纔說的,如今配置已經在Consul Config上了,你的config/gateway,dev/data裏的配置就至關於之前application-dev.yml裏的配置,按照boot對於多環境的支持要起做用,第一你要有多環境的配置文件,你有了config/gateway,dev/data,第二你啓動的時候加了-Dspring.profiles.active=dev參數麼?由於你還要指定此時的運行環境,若是你不指定,那只有config/gateway/data裏的配置會生效嘛

但願這樣的解釋對你有幫助哈~

相關文章
相關標籤/搜索