Spring Cloud Config用來爲分佈式系統中的基礎設施和微服務應用提供集中化的外部配置支持,分爲客戶端與服務端兩部分。其中服務端也成爲分佈式配置中心,是一個獨立的微服務應用,用來鏈接配置倉庫併爲客戶端提供獲取配置信息,加密/解密信息等訪問接口;客戶端則是微服務架構中的各個微服務應用或基礎設施,經過指定的配置中心來管理應用資源與業務相關的配置內容,並在服務啓動的時候從配置中心獲取和加在配置信息。git
Spring Cloud Config實現了對服務端和客戶端中環境變量和屬性配置的抽象映射。Spring Cloud Config默認採用GIT來存儲配置信息,因此使用Spring Cloud Config構建的配置服務器,自然就支持對微服務應用配置信息的版本管理,同時也支持SVN倉庫,本地化文件系統等其餘存儲方式。spring
建立基礎Spring Boot工程:config-serverbootstrap
添加依賴: spring-cloud-config-serverwindows
在主類上使用@EnableConfigServer
註解開啓Spring Cloud Config的服務端功能瀏覽器
配置Spring Cloud Config服務的基本信息及Git倉庫的相關信息安全
spring.application.name=config-server server.port=7001 ## 配置Git倉庫位置 spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/SpringCloud-Learning/ ## Git倉庫路徑下的相對搜索位置,可配置多個 spring.cloud.config.server.git.searchPaths=spring_cloud_in_action/config-repo ## Git倉庫用戶名 spring.cloud.config.server.git.username=username ## Git倉庫用戶密碼 spring.cloud.config.server.git.password=password
根據服務端配置在http://git.oschina.net/didispace/SpringCloud-Learning/spring_cloud_in_action/
下建立一個config-repo
目錄做爲配置倉庫,並根據不一樣環境新建配置文件:服務器
方便測試版本控制,在該Git倉庫的master分支的四個配置文件中設置from屬性,並分別設置不一樣的值且使1.0做爲後綴:網絡
建立一個config-label-test分支,並將各配置文件中的from屬性後綴改成2.0,經過瀏覽器,POSTMAN或者其它CURL工具請求配置內容。配置信息的URL與文件的映射關係以下:架構
構造不一樣的url來訪問不一樣的配置內容。獲取config-label-test分支,didispace應用的prod環境配置能夠訪問http://localhost:7001/didispace/prod/config-label-test
app
完成上述準備,確保配置中心已經正常開始工做,構建Spring Cloud Config客戶端並獲取上述配置信息。
建立基礎Spring Boot工程:config-client
添加依賴: spring-cloud-starter-config
配置config server位置
## 配置文件規則中{application}部分 spring.application.name=didispace ## 配置文件規則中{profile}部分 spring.cloud.config.profile=dev ## 配置文件規則中{label}部分 spring.cloud.config.label=master ## 配置中心 config-server 的地址 spring.cloud.config.uri=http://localhost:7001/ server.port=7002
建立RESTFUL接口返回配置中心from屬性,經過@Value("${from}")
註解綁定配置的from屬性
基本結構:
客戶端應用從配置中心獲取配置信息執行流程:
Spring Cloud Config中默認使用Git,對於Git的配置也很是簡單,只須要再Config Server中設置spring.cloud.config.server.git.uri
屬性爲其指定Git倉庫的網絡地址和帳戶信息便可(參考1.1章節)。
將該屬性值使用file://
前綴設置爲一個文件地址(windows系統中使用file:///
定位文件內容),那麼它將以本地倉庫的方式運行,這樣就能夠脫離Git服務端快速進行調試與開發,如:
spring.cloud.config.server.git.uri=file://${user.home}/config-repo
{application},{profile},{label}這些佔位符除了用於表示配置文件的規則以外,還能夠用於Config Server中對Git倉庫地址的URI配置。能夠經過{application}佔位符來實現一個應用對應一個Git倉庫目錄的配置效果:
## 配置Git倉庫位置 spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/{application}
{application}表明應用名,當客戶端向Config Server發起獲取配置的請求時,Config Server會根據客戶端的Spring.application.name
信息來填充{application}佔位符以定位配置資源的存儲位置,實現根據微服務應用屬性動態獲取不一樣位置的配置。對於{label}參數,若Git分支和標籤名包含"/",那麼{label}參數在HTTP的URL中應該使用"(_)"代替。
經過在URI中使用佔位符規劃和實現通用的倉庫配置:
代碼庫:使用服務名做爲Git倉庫名
配置庫:使用服務名加上-config
後綴做爲Git倉庫名稱:
服務端倉庫地址通用配置:
## 配置Git倉庫位置 spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/{application}-config
當有多個匹配規則的時候,能夠用逗號分割多個{application}/{profile}配置規則
## 配置dev 本地文件系統 profile能夠爲任意值 spring.cloud.config.server.git.repos.dev.pattern=dev/* spring.cloud.config.server.git.repos.dev.uri=file://home/git/config-repo ## 配置test Git倉庫位置 profile爲pp或oo開頭 spring.cloud.config.server.git.repos.test.pattern=test/pp*,test/oo* spring.cloud.config.server.git.repos.test.uri=http://git.oschina.net/didispace/{application}-config
Config Server在訪問Git倉庫的時候,若採用HTTP方式進行認證須要設置username
和password
屬性配置帳戶(參考1.1章節)。也能夠採用SSH的方式,經過生成Key並在Git倉庫中進行配置匹配以實現訪問。
在使用Git或SVN倉庫以後,文件都會在Config Server的本地文件系統中存儲一份,默認會被存儲於以config-repo爲前綴的臨時目錄中,如名爲/temp/config-repo-<隨機數>的目錄。因爲其隨機性以及臨時目錄的特性,可能會發生一些不可預知的後果,爲避免這些問題,最好指定一個固定的位置存儲。經過spring.cloud.config.server.git.basedir
或spring.cloud.config.server.svn.basedir
來配置一個準備好的目錄。
Spring Cloud Config也提供了一種不使用Git倉庫或SVN倉庫的存儲方式,使用本地文件系統的存儲方式來保存配置信息。
設置屬性spring.profiles.active=native
,Config Server會默認從應用的src/main/resource
目錄下搜索配置文件。若須要指定搜索配置文件的路徑,經過spring.cloud.config.server.native.serchLocation
屬性來指定具體的配置文件位置。
Spring Cloud Config服務端爲spring-boot-actuator模塊的/health端點實現了對應的健康檢測器。它默認構建一個application爲app的倉庫,當使用佔位符配置URI時(以2.2.1章節爲例),該檢測器會不斷檢查http://git.oschina.net/didispace/app-config倉庫是否能夠連通,所以控制檯會出現警告信息。
配置實際存在的倉庫進行連通檢測
spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/{application}-config spring.cloud.config.server.git.username=username spring.cloud.config.server.git.password=password ## name: 應用名 spring.cloud.config.server.health.repositories.check.name=check-repo ## label: 分支名 spring.cloud.config.server.health.repositories.check.label=master ## profiles: 環境名 spring.cloud.config.server.health.repositories.check.profiles=default
實現對倉庫check-repo-config
的連通性檢測
關閉健康檢測器
spring.cloud.config.server.health.enabled=false
覆蓋屬性配置的參數,不會被Spring Cloud客戶端修改,而且Spring Cloud客戶端從Config Server中獲取配置信息時,都會取得這些配置信息。覆蓋屬性參數並不是強制的,能夠經過改變客戶端中更高優先級的配置方式選擇是否使用Config Server提供的默認值。
spring.cloud.config.server.overrides.name=didi spring.cloud.config.server.overrides.from=shanghai
爲配置中心實現安全保護的方式有不少,如:物理網絡限制,OAuth2受權等。因爲微服務應用和配置中心構建於Spring Boot基礎上,因此與Spring Security結合更加方便。
只需在配置中心加入spring-boot-starter-security
依賴便可實現對配置中心訪問的安全保護。默認狀況下,會獲取一個名爲user的用戶,在配置中心啓動時,在日誌中打印出該用戶的隨機密碼:
INFO 22028 --- [ main] b.a.s.AuthenticationManagerConfiguration : Using default security password: 1a32a848-da0c-4590-9c58-e860be8c50dd
多數狀況下不會使用隨機生成密碼的機制,能夠在配置中心的配置文件中指定用戶和密碼:
security.user.name=user security.user.password=1a32a848-da0c-4590-9c58-e860be8c50dd
在客戶端中加入安全信息來經過校驗:
spring.cloud.config.username=user spring.cloud.config.password=1a32a848-da0c-4590-9c58-e860be8c50dd