SpringCloud Config (六)

分佈式配置中心 Spring Cloud Config

Spring Cloud Config用來爲分佈式系統中的基礎設施和微服務應用提供集中化的外部配置支持,分爲客戶端與服務端兩部分。其中服務端也成爲分佈式配置中心,是一個獨立的微服務應用,用來鏈接配置倉庫併爲客戶端提供獲取配置信息,加密/解密信息等訪問接口;客戶端則是微服務架構中的各個微服務應用或基礎設施,經過指定的配置中心來管理應用資源與業務相關的配置內容,並在服務啓動的時候從配置中心獲取和加在配置信息。git

Spring Cloud Config實現了對服務端和客戶端中環境變量和屬性配置的抽象映射。Spring Cloud Config默認採用GIT來存儲配置信息,因此使用Spring Cloud Config構建的配置服務器,自然就支持對微服務應用配置信息的版本管理,同時也支持SVN倉庫,本地化文件系統等其餘存儲方式。spring

1. 快速集成 Spring Cloud Config

1.1 構建配置中心(服務端)

  1. 建立基礎Spring Boot工程:config-serverbootstrap

  2. 添加依賴: spring-cloud-config-serverwindows

  3. 在主類上使用@EnableConfigServer註解開啓Spring Cloud Config的服務端功能瀏覽器

  4. 配置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

1.2 配置規則詳解

根據服務端配置在http://git.oschina.net/didispace/SpringCloud-Learning/spring_cloud_in_action/下建立一個config-repo目錄做爲配置倉庫,並根據不一樣環境新建配置文件:服務器

  • didispace.properties
  • didispace-dev.properties
  • didispace-test.properties
  • didispace-prod.properties

方便測試版本控制,在該Git倉庫的master分支的四個配置文件中設置from屬性,並分別設置不一樣的值且使1.0做爲後綴:網絡

  • from=git-default-1.0
  • from=git-dev-1.0
  • from=git-test-1.0
  • from=git-prod-1.0

建立一個config-label-test分支,並將各配置文件中的from屬性後綴改成2.0,經過瀏覽器,POSTMAN或者其它CURL工具請求配置內容。配置信息的URL與文件的映射關係以下:架構

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

構造不一樣的url來訪問不一樣的配置內容。獲取config-label-test分支,didispace應用的prod環境配置能夠訪問http://localhost:7001/didispace/prod/config-label-testapp

1.3 客戶端配置映射

完成上述準備,確保配置中心已經正常開始工做,構建Spring Cloud Config客戶端並獲取上述配置信息。

  1. 建立基礎Spring Boot工程:config-client

  2. 添加依賴: spring-cloud-starter-config

  3. 配置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
  4. 建立RESTFUL接口返回配置中心from屬性,經過@Value("${from}")註解綁定配置的from屬性

2. 配置中心(服務端)詳解

2.1 基礎架構

基本結構:

  • 遠程Git倉庫:存儲配置文件的地方
  • Config Server:分佈式配置中心
  • 本地Git倉庫:在Config Server的文件系統中,每次客戶端請求獲取配置信息時,Config Server從Git倉庫中獲取最新的配置到本地,而後在本地Git倉庫中讀取並返回,當遠程倉庫沒法獲取時,直接將本地內容返回。
  • Service A, Service B:微服務應用,它們指定Config Server的地址,應用在啓動的時候,實現從外部化獲取應用本身須要的配置信息。

客戶端應用從配置中心獲取配置信息執行流程:

  1. 應用啓動時,根據bootstrap.yml配置的應用名{application},環境名{profile},分支名{label}向Config Server請求獲取配置信息。
  2. Config Server根據本身維護的Git倉庫信息和客戶端傳遞過來的配置定位信息查找配置信息。
  3. Config Server將找到的配置信息下載到Config Server的文件系統中。
  4. Config Server建立Spring的ApplicationContext實例,並從Git本地倉庫中加在配置文件,最後將這些配置內容讀取出來返回給客戶端應用。
  5. 客戶端應用在得到外部配置文件後加載到客戶端的ApplicationContext實例,該配置內容的優先級高於客戶端Jar包內部的配置內容,因此在Jar包中重複的內容將再也不被加載。

2.2 Git配置倉庫

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

2.2.1 佔位符配置URI

{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倉庫位置
spring.cloud.config.server.git.uri=http://git.oschina.net/didispace/{application}-config

2.2.2 配置多個倉庫

當有多個匹配規則的時候,能夠用逗號分割多個{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

2.2.3 訪問權限

Config Server在訪問Git倉庫的時候,若採用HTTP方式進行認證須要設置usernamepassword屬性配置帳戶(參考1.1章節)。也能夠採用SSH的方式,經過生成Key並在Git倉庫中進行配置匹配以實現訪問。

2.3 本地倉庫

在使用Git或SVN倉庫以後,文件都會在Config Server的本地文件系統中存儲一份,默認會被存儲於以config-repo爲前綴的臨時目錄中,如名爲/temp/config-repo-<隨機數>的目錄。因爲其隨機性以及臨時目錄的特性,可能會發生一些不可預知的後果,爲避免這些問題,最好指定一個固定的位置存儲。經過spring.cloud.config.server.git.basedirspring.cloud.config.server.svn.basedir來配置一個準備好的目錄。

2.4 本地文件系統

Spring Cloud Config也提供了一種不使用Git倉庫或SVN倉庫的存儲方式,使用本地文件系統的存儲方式來保存配置信息。

設置屬性spring.profiles.active=native,Config Server會默認從應用的src/main/resource目錄下搜索配置文件。若須要指定搜索配置文件的路徑,經過spring.cloud.config.server.native.serchLocation屬性來指定具體的配置文件位置。

2.5 健康檢測

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

2.6 屬性覆蓋

覆蓋屬性配置的參數,不會被Spring Cloud客戶端修改,而且Spring Cloud客戶端從Config Server中獲取配置信息時,都會取得這些配置信息。覆蓋屬性參數並不是強制的,能夠經過改變客戶端中更高優先級的配置方式選擇是否使用Config Server提供的默認值。

spring.cloud.config.server.overrides.name=didi
spring.cloud.config.server.overrides.from=shanghai

2.7 安全保護

爲配置中心實現安全保護的方式有不少,如:物理網絡限制,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
相關文章
相關標籤/搜索