springcloud系列—Config—第6章-2: Spring Cloud Config 服務端詳解、git(svn、本地倉庫)配置
資料參考:《Spring Cloud 微服務實戰》
目錄
服務端詳解
前面一篇《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
請求獲取配置資訊來進行載入。
二:客戶端應用從配置管理中獲取配置資訊遵從下面的執行流程:
- 應用啟動時,根據
bootstrap.yml
中配置的應用名{application}
,環境名{profile}
,分支名{label}
,向config server
請求獲取配置資訊 config server
根據自己維護的git倉庫資訊和客戶端傳遞過來的配置資訊去查詢配置資訊。- 根據
git clone
Config Server
的檔案系統中 Config Server
建立Spring的ApplictionContext例項,並從git本地倉庫中載入配置檔案,最後將這些配置內容讀取出來返回給客戶端應用。- 客戶端應用在獲取外部配置檔案後加載到客戶端的
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.basedir
或spring.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
除了可以通過application
和profile
模式來匹配配置倉庫之外,還支援通過帶有萬用字元的表示式來匹配,以實現更為複雜的配置要求。並且當我們有多個匹配規則的時候,還可以通過逗號來分割多個{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}
模式未能匹配到合適的倉庫時,就將在該預設倉庫位置下獲取配置資訊。除此之外,還配置了三個倉庫,分別是dev
,test
,prod
。其中,dev
倉庫匹配dev/*
的模式,所以無論profile
是什麼,它都能匹配application
名稱為dev
的應用。並且我們可以注意到,它儲存的配置檔案位置還採用了config server
的本地檔案系統中的內容。對於此位置,我們可以通過訪問http://localhost:9090/dev/profile
的請求來驗證到該倉庫的配置內容,其中profile
可以是任意值。而test
和prod
倉庫均使用git倉庫的儲存,並且test倉庫未配置匹配規則,所以它只匹配application
名為test
的應用;prod
倉庫則需要匹配application
為prod
並且profile
為pp
開頭,或者application
為online
並且profile
為oo
開頭的應用和環境。
當配置多個倉庫的時候,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的方式進行認證,那麼我們需要增加username
和password
屬性來配置賬戶,比如快速入門的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
作為倉庫來儲存配置檔案了,對於客戶端來說,這個過程是透明的,所以不需要做任何變動。
本地倉庫
在使用了git
或svn
倉庫之後,檔案都會在config server
的本地檔案系統中儲存一份,這些檔案預設會被儲存以config-repo
為字首的臨時目錄中,比如/tmp/config-repo-<隨機數>
的目錄。由於其隨機性以及臨時目錄的特性,可能會有一些不可預知的後果,為了避免將來可能會出現的問題,最好的方法就是指定一個固定的位置來儲存這些重要資訊。我們只需要通過spring.cloud.config.server.git.basedir
或spring.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