1. 程式人生 > >springcloud系列—Config—第6章-2: Spring Cloud Config 服務端詳解、git(svn、本地倉庫)配置

springcloud系列—Config—第6章-2: Spring Cloud Config 服務端詳解、git(svn、本地倉庫)配置

資料參考:《Spring Cloud 微服務實戰》

目錄

服務端詳解

基本架構

git配置倉庫

佔位符配置url

配置多個倉庫

子目錄儲存

訪問許可權

svn配置倉庫

本地倉庫

本地檔案系統


服務端詳解

前面一篇《springcloud系列—Zuul—第6章-1: Spring Cloud Config 配置中心》我們實現了一個具備基本結構得配置管理服務端和客戶端,同事講解了其中得一些配置得基本原理和規則。在本節我們將進一步瞭解Spring Cloud Config服務端得一些用法。

基本架構

 一:我們需要深入瞭解一下配置中心是如何運作起來得。下面是它的

基本結構圖

  • 遠端git倉庫:用來儲存配置檔案的地方,快速入門中應用名為zhihao的多環境配置檔案:zhihao-{profile}.properties.
  • config server:這是我們快速入門中構建的分散式配置中心,config-server-git專案,在該工程中指定了所要連線的git倉庫位置以及賬戶,密碼等連線資訊。
  • 本地git倉庫:在config server的檔案系統中,每次客戶端請求獲取配置資訊時,Config Server從git倉庫中獲取最新的配置到本地,然後在本地git倉庫中讀取並返回。當遠端倉庫無法獲取時,直接將本地的內容返回。
  • Service A,Service B
    :具體的微服務應用,他們指定了config Server地址,從而實現從外部化獲取應用自己要用的配置資訊。這些應用在啟動的時候,會向config server請求獲取配置資訊來進行載入。

 

二:客戶端應用從配置管理中獲取配置資訊遵從下面的執行流程

  1.  應用啟動時,根據bootstrap.yml中配置的應用名{application},環境名{profile},分支名{label},向config server請求獲取配置資訊
  2. config server根據自己維護的git倉庫資訊和客戶端傳遞過來的配置資訊去查詢配置資訊。
  3. 根據git clone
    命令將找到的配置資訊下載到Config Server的檔案系統中
  4. Config Server建立Spring的ApplictionContext例項,並從git本地倉庫中載入配置檔案,最後將這些配置內容讀取出來返回給客戶端應用。
  5. 客戶端應用在獲取外部配置檔案後加載到客戶端的ApplicationContext例項,該配置內容的優先順序高於客戶端jar包內部的配置內容,所以在jar包中重複的內容不再被載入。 


git配置倉庫

spring cloud config的服務端,對於配置倉庫的預設實現採用了git。git非常適用於儲存配置內容,它可以非常方便的使用各種第三方工具來對內容進行管理更新和版本化,同時git倉庫的hook功能還可以幫助我們實時的監控配置內容的修改。其中,git自身的版本控制功能正是其他一些配置中心所欠缺的,通過git進行儲存意味著,一個應用的不同部署例項可以從spring cloud config的服務端獲取不同的版本配置,從而支援一些特殊的應用場景。

由於spring cloud config中預設使用git,所以我們只需要在config server中的application.properties中設定spring.cloud.config.server.git.uri屬性,比如下面的配置:

spring.application.name=config-server-git
server.port=7001

spring.cloud.config.server.git.uri=https://github.com/servef-toto/SpringCloud-Demo/
spring.cloud.config.server.git.search-paths=config-server-file/git-config
spring.cloud.config.server.git.username=servef-toto
spring.cloud.config.server.git.password=0311aiWuLiuHong

如果我們將該值通過file://字首來設定為一個檔案地址(在window系統中,要使用file:///來定位檔案內容),那麼它將以本地倉庫的方式執行,這樣我們就可以脫離git服務端來快速進行除錯與開發,比如:因為在快速入門的時候我們知道配置git倉庫的時候讀取配置會從git遠端倉庫中git clone到本地,我的控制檯日誌告訴我下載到本地的/var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/資料夾下(當然自己也可以git clone遠端的配置資訊到本地),

所以如下配置(spring.cloud.config.server.git.uri=file://${user.home}/config-repo)

spring:
  application:
    name: config-server-git
  cloud:
    config:
      server:
        git:
          uri: file://var/folders/p0/kw_s_8xj2gqc929nys7cj2yh0000gn/T/config-repo-2847833657021753497/config-repo

其中,${user.home}代表當前使用者的所屬目錄,file://配置的本地檔案系統方式雖然對於本地開發除錯時使用非常方便,但是該方式也僅用於開發與測試,在生產環境中務必搭建自己的git倉庫來儲存配置資源。

With VCS based backends (git, svn) files are checked out or cloned to the local filesystem. By default they are put in the system temporary directory with a prefix of config-repo-. On linux, for example it could be /tmp/config-repo-<randomid>. Some operating systems routinely clean out temporary directories. This can lead to unexpected behaviour such as missing properties. To avoid this problem, change the directory Config Server uses, by setting
spring.cloud.config.server.git.basedir or spring.cloud.config.server.svn.basedir to a directory that does not reside in the system temp structure.

使用基於VCS的後端(git,svn)檔案被檢出或克隆到本地檔案系統。 預設情況下,它們放在系統臨時目錄中,字首為config-repo-。 在linux上,例如可以是/tmp/config-repo- <randomid>。 一些作業系統會定期清除臨時目錄。 這可能會導致意外的行為,例如缺少屬性。 為避免此問題,請通過將spring.cloud.config.server.git.basedirspring.cloud.config.server.svn.basedir設定為不駐留在系統臨時結構中的目錄來更改Config Server所使用的目錄。

佔位符配置url

{application},{profile},{label}這些佔位符除了用於標識配置檔案的規則之外,還可以用於config Server中對git倉庫地址的url配置。比如我們可以通過{application}佔位符實現一個應用對應一個git倉庫目錄的配置效果,具體配置實現:

具體配置實現:

spring.cloud.config.server.git.uri=http://git.oschina.net/zhihaomiao/{application}
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password

其中,{application}代表了應用名,所以當客戶端應用向config server發起獲取配置的請求時,Config server會根據客戶端的spring.application.name資訊來填充{application}佔位符以定位配置資源的儲存位置,從而實現根據微服務應用的屬性動態獲取不同的配置。另外,在這些佔位符中,{label}引數較為特別,如果git的分支和標籤名包含"/",那麼{label}引數在http的url中應該使用"(_)"來代替,以避免改變了url含義,指向到其他的url資源。

當我們使用git作為配置中心來儲存各個微服務應用配置檔案的時候,該功能會變得非常有用,通過在url中使用佔位符可以幫助我們規劃和實現通用的倉庫配置,比如,下面的規劃:

  • 程式碼庫:使用服務名作為git倉庫名稱,比如使用者服務的程式碼庫http://git.oschina.net/zhihaomiao/user-service
  • 配置庫:使用服務名加上-config字尾作為git倉庫名稱,比如使用者服務的配置庫地址位置是http://git.oschina.net/zhihaomiao/user-service-config

這時,我們就可以使用spring.cloud.config.server.git.uri=http://git.oschina.net/zhihaomiao/{application}-config配置,來同時匹配多個不同服務的配置倉庫。

配置多個倉庫

config server除了可以通過applicationprofile模式來匹配配置倉庫之外,還支援通過帶有萬用字元的表示式來匹配,以實現更為複雜的配置要求並且當我們有多個匹配規則的時候,還可以通過逗號來分割多個{application}/{profile}配置規則,比如:

spring.cloud.config.server.git.uri=http://git.oschina.net/zhihaomiao/config-repo

spring.cloud.config.server.git.repos.dev.pattern=dev/*
spring.cloud.config.server.git.repos.dev.uri=file://home/git/config-repo

spring.cloud.config.server.git.repos.test=http://git.oschina.net/test/config-repo

spring.cloud.config.server.git.repos.prod.pattern=prod/pp*,online/oo*
spring.cloud.config.server.git.repos.prod.uri=http://git.oschina.net/prod/config-repo

上述配置內容通過配置內容spring.cloud.config.server.git.uri屬性,指定了一個預設的倉庫位置,當使用{application}/{profile}模式未能匹配到合適的倉庫時,就將在該預設倉庫位置下獲取配置資訊。除此之外,還配置了三個倉庫,分別是devtestprod。其中,dev倉庫匹配dev/*的模式,所以無論profile是什麼,它都能匹配application名稱為dev的應用。並且我們可以注意到,它儲存的配置檔案位置還採用了config server的本地檔案系統中的內容。對於此位置,我們可以通過訪問http://localhost:9090/dev/profile的請求來驗證到該倉庫的配置內容,其中profile可以是任意值。而testprod倉庫均使用git倉庫的儲存,並且test倉庫未配置匹配規則,所以它只匹配application名為test的應用;prod倉庫則需要匹配applicationprod並且profilepp開頭,或者applicationonline並且profileoo開頭的應用和環境。

當配置多個倉庫的時候,config server在啟動的時會直接克隆第一個倉庫的配置庫,其他的配置只有在請求時才會克隆到本地,所以對於倉庫的排列可以根據配置內容的重要程度有所區分。另外,如果表示式是以萬用字元開始的,那麼需要使用引號將配置內容引起來。

子目錄儲存

除了支援佔位符配置,多倉庫配置之外,config server還可以將配置檔案定位到git倉庫的子目錄中。我們在快速入門中的我們除了配置spring.cloud.config.server.git.uri之外海配置了另外一個引數:spring.cloud.config.server.git.search-paths,通過這個引數可以實現在http://git.oschina.net/zhihaomiao/config-repo-demo倉庫的config-repo子目錄下實現配置的儲存

spring:
  application:
    name: config-server-git
  cloud:
    config:
      server:
        git:
          uri: http://git.oschina.net/zhihaomiao/config-repo-demo
          username: 
          password: 
          search-paths: config-repo
server:
  port: 9090

通過上面的配置,我們可以實現http://git.oschina.net/zhihaomiao/config-repo-demo倉庫下,一個應用一個目錄的效果。

對於spring.cloud.config.server.git.search-paths引數的配置也支援使用{application},{profile}{label}佔位符,比如:

spring:
  application:
    name: config-server-git
  cloud:
    config:
      server:
        git:
          uri: http://git.oschina.net/zhihaomiao/config-repo-demo
          username: 
          password: 
          search-paths: {application}
server:
  port: 9090

這種方式也可以一個服務一個目錄,這樣就可以在一個倉庫中管理多個服務的配置,這種方式也比較好。

訪問許可權

config server在訪問git倉庫的時候,若採用http的方式進行認證,那麼我們需要增加usernamepassword屬性來配置賬戶,比如快速入門的demo

 spring:
  application:
    name: config-server-git
  cloud:
    config:
      server:
        git:
          uri: http://git.oschina.net/zhihaomiao/config-repo-demo
          username: 
          password: 
          search-paths: config-repo
server:
  port: 9090

若不採用http的認證方式,我們也可以採用ssh的方式,通過生成key並在git倉庫中進行配置匹配以實現訪問。

 

svn配置倉庫

config server除了支援git倉庫之外,也能使用svn倉庫,只需要如下配置。

  • 在pom.xml中引入svn的依賴配置,讓config server擁有讀取svn內容的能力:
  • application.properties中使用svn的配置屬性來指定svn伺服器的位置,以及訪問的賬戶名與密碼:
spring.cloud.config.server.svn.uri=svn://localhost:443/didispace/config-repo
spring.cloud.config.server.svn.username=username
spring.cloud.config.server.svn.password=password

通過上面的配置修改,config server就可以使用svn作為倉庫來儲存配置檔案了,對於客戶端來說,這個過程是透明的,所以不需要做任何變動。

本地倉庫

在使用了gitsvn倉庫之後,檔案都會在config server的本地檔案系統中儲存一份,這些檔案預設會被儲存以config-repo為字首的臨時目錄中,比如/tmp/config-repo-<隨機數>的目錄由於其隨機性以及臨時目錄的特性,可能會有一些不可預知的後果,為了避免將來可能會出現的問題,最好的方法就是指定一個固定的位置來儲存這些重要資訊。我們只需要通過spring.cloud.config.server.git.basedirspring.cloud.config.server.svn.basedir來配置一個我們準備好的目錄即可

本地檔案系統

spring cloud config也提供了一種不適用git倉庫或svn倉庫的儲存方式,而是使用本地檔案系統的儲存方式來儲存配置資訊。實現方式也簡單,只需要配置屬性spring.profile.active=native,config server會預設從應用的src/main/resource目錄下搜尋配置檔案。如果需要指定搜尋配置檔案的路徑,我們可以通過spring.cloud.config.server.native.searchLocations屬性來指定具體的配置檔案位置。

雖然spring cloud config提供了這樣的功能,但是為了支援更好的內容管理和版本控制等強大功能,還是推薦使用git倉庫的方式

 

git地址:https://github.com/servef-toto/SpringCloud-Demo/tree/master/config-server-file/git-config