上一篇:《Spring Cloud入門教程(七):分布式鏈路跟蹤(Sleuth)》
本人和同事撰寫的《Spring Cloud微服務架構開發實戰》一書也在京東、當當等書店上架,大家可以點擊這里前往購買,多謝大家支持和捧場!
對于配置的重要性,我想我不用進行任何強調,大家都可以明白其重要性。在普通單體應用,我們常使用配置文件(application(*).properties(yml))管理應用的所有配置。這些配置文件在單體應用中非常勝任其角色,并沒有讓我們感覺到有頭疼的地方。但隨著微服務框架的引入,微服務數量就會在我們產品中不斷增加,之前我們重點考慮的是系統的可伸縮、可擴展性好,但隨之就是配置管理的問題就會一一暴露出來。起初微服務器各自管各自的配置,在開發階段并沒什么問題,但到了生產環境管理就會很頭疼,如果要大規模更新某項配置,困難就可想而知。
為此,在分布式系統中,Spring Cloud提供一個Config子項目,該項目核心就是配置中心,通過一個服務端和多個客戶端實現配置服務。我們可使用配置服務器集中的管理所有服務的各種環境配置文件。配置服務中心默認采用Git的方式進行存儲,因此我們很容易部署修改,并可以對環境配置進行版本管理。
Spring Cloud Config具有中心化、版本控制、支持動態更新和語言獨立等特性。其特點是:
- 提供服務端和客戶端支持(Spring Cloud Config Server和Spring Cloud Config Client);
- 集中式管理分布式環境下的應用配置;
- 基于Spring環境,實現了與Spring應用無縫集成;
- 可用于任何語言開發的程序;
- 默認實現基于Git倉庫(也支持SVN),從而可以進行配置的版本管理;
Spring Cloud Config的結構圖如下:
從圖中可以看出Spring Cloud Config有兩個角色(類似Eureka): Server和Client。Spring Cloud Config Server作為配置中心的服務端承擔如下作用:
- 拉取配置時更新Git倉庫副本,保證是配置為最新;
- 支持從yml、json、properties等文件加載配置;
- 配合Eureke可實現服務發現,配合Cloud Bus(這個后面我們在詳細說明)可實現配置推送更新;
- 默認配置存儲基于Git倉庫(可以切換為SVN),從而支持配置的版本管理.
而對于,Spring Cloud Config Client則非常方便,只需要在啟動配置文件中增加使用Config Server上哪個配置文件即可。
1. 示例代碼
1.1 構建Config-Server
編寫pom.xml文件
Config-Server
是一個標準的Spring Boot應用,所以pom.xml
也是繼承之前的Parent:
<parent>
<groupId>twostepsfromjava.cloud</groupId>
<artifactId>twostepsfromjava-cloud-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../parent</relativePath>
</parent>
<artifactId>config-server</artifactId>
<name>Spring Cloud Sample Projects: Config Server</name>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
編寫啟動類
/**
* TwoStepsFromJava Cloud -- Config Server
*
* @author CD826(CD826Dong@gmail.com)
* @since 1.0.0
*/
@SpringBootApplication
@EnableConfigServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
這里最重要的就是增加@EnableConfigServer
,其它與之前的應用一致。
編寫配置文件
server.port=8280
spring.application.name=config-server
spring.cloud.config.server.git.uri=https://github.com/cd826/SpringcloudSamplesConfig
spring.cloud.config.server.git.username=your git username
spring.cloud.config.server.git.password=your git password
這里最重要的是需要配置Git倉庫的地址及登錄用戶名和口令。
創建測試配置文件
我們在SpringcloudSamplesConfig倉庫中增加量個配置文件。
mallWeb.properties
,文件內容如下:
foo = bar
mallWeb-dev.properties
,文件內容如下:
bar = cd826
注意:這里編寫文件后記得提交,否則會測試失敗。
啟動測試
啟動config-server
. 在終端中我們輸入以下命令(或者使用postman):
curl localhost:8280/mallWeb/dev
在終端中會輸出以下內容:
{"name":"mallWeb","profiles":["dev"],"label":null,"version":null,"state":null,"propertySources":[
{"name":"https://github.com/cd826/SpringcloudSamplesConfig/mallWeb-dev.properties","source":{"bar":"cd826"}},
{"name":"https://github.com/cd826/SpringcloudSamplesConfig/mallWeb.properties","source":{"foo":"bar"}}
]}
這里可以看到,我們提交到Git中的配置文件已經能夠被config-server
正確的讀取到。
config-server默認配置
當我們查看源碼會發現在spring-cloud-config-server.jar包中有一個默認配置文件configserver.yml
配置文件,也就是說當我們設置spring.application.name=configserver
時,就會默認加載該配置文件,該配置文件內容如下:
info:
component: Config Server
spring:
application:
name: configserver
jmx:
default_domain: cloud.config.server
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
repos:
- patterns: multi-repo-demo-*
uri: https://github.com/spring-cloud-samples/config-repo
server:
port: 8888
management:
context_path: /admin
默認使用8888
端口,并且從https://github.com/spring-cloud-samples/config-repo
這個Git倉庫中查找配置文件。
因為,在上面的示例中我們重新定義了應用名稱和服務端口。
1.2 構建config-client
config-client可以是任何一個基于Spring boot的應用,這里為了講解方便,我們構建一個非常簡單的web工程。
編寫pom.xml文件
我們的config-client
項目需要引入對spring-cloud-starter-config
的依賴,如下:
<parent>
<groupId>twostepsfromjava.cloud</groupId>
<artifactId>twostepsfromjava-cloud-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../parent</relativePath>
</parent>
<artifactId>config-client</artifactId>
<name>Spring Cloud Sample Projects: Config Client</name>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
編寫啟動類
一個標準的Spring Boot啟動類:
/**
* TwoStepsFromJava Cloud -- Config Client Project
*
* @author CD826(CD826Dong@gmail.com)
* @since 1.0.0
*/
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
編寫測試Controller
這個測試Controller主要就是驗證我們可以從Git倉庫中獲取配置內容。
/**
* Config Client Test Controller
*
* @author CD826(CD826Dong@gmail.com)
* @since 1.0.0
*/
@RestController
@RequestMapping("/cfg")
public class ConfigController {
@Value("${foo}")
String foo;
@Value("${bar}")
String bar;
@RequestMapping(value = "/foo")
public String foo(){
return foo + "——" + bar;
}
}
編寫配置文件
這里編寫的配置文件名稱為:bootstrap.properties
,內容如下:
server.port=8080
spring.application.name=mallWeb
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:8280/
定義了微服務的名稱和profile以及配置服務器的地址。
注意: 這些配置不能夠配置在
application.properties
文件中,因為在Spring Boot啟動時有引導上下文和應用上下文的概念,只有將配置服務器信息定義在引導上下文中,才能夠從配置服務器中獲取到配置信息。否則,服務啟動時會報找不到foo變量定義的錯誤。
1.3 啟動測試
啟動后我們可以訪問:http://localhost:8080/cfg/foo,可以看到如下界面:
說明,我們的config-client已經成功從config-server上獲取到配置的數據了。
1.4 Spring項目配置加載順序
- 這里是列表文本命令行參數
- SPRING_APPLICATION_JSON 參數
- 從java:comp/env 加載 JNDI 屬性
- Java系統屬性 (System.getProperties())
- 操作系統環境變量
- 如果有使用 random.* 屬性配置,則使用 RandomValuePropertySource 產生
- 外部特定應用配置文件 例如:application-{profile}.properties 或者 YAML variants
- 內部特定應用配置文件 例如:application-{profile}.properties 或者 YAML variants
- 外部應用配置文件 例如:application.properties 或者 YAML variants
- 內部應用配置文件 例如:application.properties 或者 YAML variants
- 加載@Configuration類的 @PropertySource 或者 @ConfigurationProperties 指向的配置文件
- 默認配置,通過SpringApplication.setDefaultProperties 設置
2. 配置規則詳解
下面我們來看一看Config Client從Config Server中獲取配置數據的流程:
-
Config Client啟動時,根據
bootstrap.properties
中配置的應用名稱(application)、環境名(profile)和分支名(label),向Config Server請求獲取配置數據;
-
Config Client啟動時,根據
- Config Server根據Config Client的請求及配置,從Git倉庫(這里以Git為例)中查找符合的配置文件;
- Config Server將匹配到的Git倉庫拉取到本地,并建立本地緩存;
-
Config Server創建Spring的
ApplicationContext
實例,并根據拉取的配置文件,填充配置信息,然后將該配置信息返回給Config Client;
-
Config Server創建Spring的
- Config Client獲取到Config Server返回的配置數據后,將這些配置數據加載到自己的上下文中。同時,因為這些配置數據的優先級高于本地Jar包中的配置,因此將不再加載本地的配置。
那么,Config Server又是如何與Git倉庫中的配置文件進行匹配的呢?通常,我們會為一個項目建立類似如下的配置文件:
- mallweb.properties: 基礎配置文件;
- mallweb-dev.properties: 開發使用的配置文件;
- mallweb-test.properties: 測試使用的配置文件;
- mallweb-prod.properties: 生產環境使用的配置文件;
當我們訪問Config Server的端點時,就會按照如下映射關系來匹配相應的配置文件:
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
上面的Url將會映射為格式為:{application}-{profile}.properties(yml)的配置文件。另外,label則對應Git上分支名稱,是一個可選參數,如果沒有則為默認的master分支。
而Config-Client的bootstrap.properties
配置對應如下:
- spring.application.name <==> application;
- spring.cloud.config.profile <==> profile;
- spring.cloud.config.label <==> label.
2.1 Git倉庫配置
Config Server默認使用的就是Git,所以配置也非常簡單,如上面的配置(application.properties):
spring.cloud.config.server.git.uri=http://
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password
那么客戶端在請求時服務端就會到該倉庫中進行查找。
2.1.1 使用占位符
在服務端配置中我們也可以使用{application}、{profile} 和 {label}占位符,如下:
spring.cloud.config.server.git.uri=http://github.com/cd826/{application}
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password
這樣,我們就可以為每一個應用客戶端創建一個單獨的倉庫。
這里需要注意的是,如果Git的分支或標簽中包含"/"時,在{label}參數中需要使用"(_)"替代,這個主要是避免與Http URL轉義符處理的沖突。
2.1.2 使用模式匹配
我們也可以使用{application}/{profile}進行模式匹配,以便獲取到相應的配置文件。配置示例如下:
spring.cloud.config.server.git.uri=https://github.com/spring-cloud-samples/config-repo
spring.cloud.config.server.git.repos.simple=https://github.com/simple/config-repo
spring.cloud.config.server.git.repos.special.pattern=special*/dev*,*special*/dev*
spring.cloud.config.server.git.repos.special.uri=https://github.com/special/config-repo
spring.cloud.config.server.git.repos.local.pattern=local*
spring.cloud.config.server.git.repos.local.uri=file:/home/configsvc/config-repo
如果模式中需要配置多個值,那么可以使用逗號分隔。
如果{application}/{profile}沒有匹配到任何資源,則使用spring.cloud.config.server.git.uri
配置的默認URI。
當我們使用yml類型的文件進行配置時,如果模式屬性是一個YAML數組,也可以使用YAML數組格式來定義。這樣可以設置成多個配個配置文件,如:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
repos:
development:
pattern:
- */development
- */staging
uri: https://github.com/development/config-repo
staging:
pattern:
- */qa
- */production
uri: https://github.com/staging/config-repo
2.1.3 搜索目錄
當我們把配置文件存放在Git倉庫中子目錄中時,可以通過設置serch-path
來指定該目錄。同樣,serch-path
也支持上面的占位符。示例如下:
spring.cloud.config.server.git.uri=https://github.com/spring-cloud-samples/config-repo
spring.cloud.config.server.git.searchPaths=foo,bar*
這樣系統就會自動搜索foo的子目錄,以及以bar開頭的文件夾中的子目錄。
2.1.4 SSH配置
如果你不想使用HTTPS和用戶認證,也可以直接使用SSH,這時候我們只需要將ssh需要的keys存儲在~/.ssh
目錄即可,并將所配置的uri指向SSH地址即可,如:git@github.com:cd826/SpringcloudSamplesConfig
。
如果你清楚的知道你的~/.git
目錄,那么你可以使用git config --global
來配置。否則可以使用全局配置,比如:git config --global http.sslVerify false
。
2.1.4 代理
Config-Server會使用JGit訪問配置庫,因此我們可以在~/.git/config
下配置HTTPS所使用的代理,也可以使用JVM系統屬性-Dhttps.proxyHost
和-Dhttps.proxyPort
來配置。
2.1.5 本地緩存
當Config-Server從Git(或SVN)中獲取了配置信息后,將會在本地的文件系統中存儲一份。默認將存儲在系統臨時目錄下,并且以config-repo-
作為開頭,在Linux系統中默認存儲的目錄為/tmp/config-repo-<randomid>
。Config-Server將配置信息存儲在本地可以有效的防止當Git倉庫出現故障而無法訪問的問題,當Config-Server無法訪問到Git倉庫時就會讀取之前存儲在本地文件中的配置,然后將這些配置信息返回給Config-Client。比如,當我們斷開網絡進行測試,當我們啟動Config-Server時會在控制臺中看到以下輸出:
17:18:01 285 [http-nio-8280-exec-1] WARN o.s.c.c.s.e.MultipleJGitEnvironmentRepository - Could not fetch remote for master remote: https://github.com/cd826/SpringcloudSamplesConfig
17:18:01 660 [http-nio-8280-exec-1] INFO o.s.c.a.AnnotationConfigApplicationContext - Refreshing
17:18:01 710 [http-nio-8280-exec-1] INFO o.s.b.f.a.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
17:18:01 782 [http-nio-8280-exec-1] INFO o.s.c.c.s.e.NativeEnvironmentRepository - Adding property source: file:/Users/cd826/MyWork/springcloud-sample-projects/config/config-server/tmp/mallWeb-dev.properties
17:18:01 782 [http-nio-8280-exec-1] INFO o.s.c.c.s.e.NativeEnvironmentRepository - Adding property source: file:/Users/cd826/MyWork/springcloud-sample-projects/config/config-server/tmp/mallWeb.properties
Spring Cloud 官方文檔建議我們在Config-Server中指定本地文件路徑,以避免出現不可預知的錯誤。可以使用下面的屬性配置來指定本地文件路徑:
## Git倉庫
spring.cloud.config.server.git.basedir=tmp/
## SVN倉庫
spring.cloud.config.server.svn.basedir=tmp/
2.2 SVN配置
如果你的項目中使用的是SVN而不是Git,那么只需要在Config-Server中進行如下修改就可以支持SVN倉庫。
2.2.1 修改pom.xml
在pom文件中增加以下依賴:
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
</dependency>
2.2.2 修改appliaction.properties
spring.cloud.config.server.svn.uri={your svn server}
spring.cloud.config.server.svn.username=username
spring.cloud.config.server.svn.password=password
2.3 文件系統
如果你的Config-Server中不想使用Git或SVN,那么我們也可以直接從當前classpath或文件系統中加載相應的配置文件,只需在配置文件中設置如下:
spring.profiles.active=native
注意Config-Server默認會從classpath下加載,我們可以使用spring.cloud.config.server.native.searchLocations
屬性來設置配置文件的目錄。對于文件路徑,我們的配置必須以file:
開頭,如果是Windows系統對于絕對路徑我們還得對/進行轉義,比如,在Windows下我們需要配置如下:file:///${user.home}/config-repo
。
此外,當我們使用文件系統作為配置文件倉庫時,spring.cloud.config.server.native.searchLocations
的配置也是支持{application} 、{profile} 和 {label} 占位符的。
Spring Cloud 官方還是推薦在測試和開發的時候可以使用文件系統,但是在正式環境中盡量還是使用Git或者SVN。
另,Spring Cloud Config中還支持另外一種配置文件方式:Vault Server,這個后面有空我們再探討。
3. 安全保護
3.1 Config-Server訪問安全
對于我們存儲在配置中心的一些配置內容,總會有一些是敏感信息,比如數據庫連接的用戶名和密碼,你總不能直接裸奔吧,所以我們還是需要對Config-Server做一些安全控制。當然,對于Config-Server的安全控制有很多種,比如:物理網絡限制、OAuth2授權等。但是,在這里因為我們使用的是SpringBoot,所以使用SpringSecurity會更容易也更簡單。這時候,我們只需要在Config-Server中增加如下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
此時,當我們啟動Config-Server時,SpringSecurity會默認為我們生產一個訪問密碼,這種方式常常不是我們需要的,所以一般我們還需要在配置文件中配置用戶名和密碼,比如:
security.user.name=cd826
security.user.password=pwd
這樣,當我們需要訪問Config-Server時就會彈出用戶認證對話框。此時,對于Config-Client我們需要在配置文件中增加用戶和訪問口令的配置,如下:
spring.cloud.config.username=cd826
spring.cloud.config.password=pwd
3.2 加密與解密
訪問安全是對整體的控制,多數情況下我們還需要對敏感內容加密后存儲,比如之前所說的數據庫訪問的用戶名稱和登錄口令。很幸運,Spring Cloud Config為我們提供相應的支持。
Spring Cloud Config提供了兩種加解密方式: 1)對稱加密; 2)非對稱加密。在描述如何使用之前,我們先看看一些使用前提。
3.2.1 安裝JCE(Java Cryptography Extension)
Spring Cloud Config所提供的加解密依賴JCE,因為,JDK中沒有默認提供,所以我們需要先安裝JCE。安裝方法也比較簡單,就是下載相應的Jar包,然后把這些包替換$JDK_HOME/jar/lib/security
相應的文件,對于JDK8下載地址為:JCE for JDK8.
3.2.2 加解密端點
另外,Spring Cloud Config還提供了兩個端點進行加密和解密,如下:
-
/encrypt: 加密端點,使用格式如下:
curl $CONFIG_SERVER/encrypt -d 所要加密的內容
-
/decrypt: 解密端點,使用格式如下:
curl $CONFIG_SERVER/decrypt -d 所要解密的內容
注意:當你測試中所加解密中包含特殊字符時,需要進行URL編碼,這時候你需要使用
--data-urlencode
而不是-d
.
3.2.3 對稱加密
對稱加解密的配置非常簡單。我們只需要在配置文件中增加加解密所使用的密鑰即可,如:
encrypt.key=cd826_key
配置好之后,你可以啟動Config-Server,并使用上面所說的端點進行加解密測試。
對于,配置文件我們需要為加密的內容增加一個{cipher}
前導符。如:
spring.datasource.username=dbuser
spring.datasource.password={cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
但是,如果你使用的配置文件是yml格式,那么需要使用單引號把加密內容引起來,如下:
spring:
datasource:
username:dbuser
password:'{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
3.2.4 非對稱加密
非對稱加密相對于對稱加密來說復雜了一些,首先我們需要借助Java的keytool生成密鑰對,然后創建Key Store并復制到服務器目錄下。對于keytool的使用可以參考這里:《Spring Cloud入門教程(番外篇四): Keytool證書工具》。
- 使用keytool生成Key Store,命令如下:
$ keytool -genkeypair -alias tsfjckey -keyalg RSA \
-dname "CN=Mall Web,OU=TwoStepsFromJava,O=Organization,L=city,S=province,C=china" \
-keypass javatwostepsfrom -keystore server.jks -storepass twostepsfromjava
將所生成
server.jks
拷貝到項目的resources
目錄下(Config-Server)。修改配置文件:
encrypt.key-store.location=server.jks
encrypt.key-store.alias=tsfjckey
encrypt.key-store.password=twostepsfromjava
encrypt.key-store.secret=javatwostepsfrom
非對稱加密相對于對稱加密來說配置也復雜,但安全性也會高很多。
3.2.5 使用多個加密Key
也許,我們需要對不同的敏感信息使用不同的加密key,這時候我們的配置文件只需要按如下進行編寫:
foo.bar={cipher}{key:testkey}...
Config-Server在解密的時候就會嘗試從配置文件中獲取testkey
的做為密鑰。
4. 高可用配置
4.1 整合Eureka
看到這里,可能有些童鞋已經發現,我們在Config-Client中配置config.uri
時使用的具體的地址,那么是否可以使用之前的Eureka呢?答案是肯定,我們可以把Config-Server和其它微服務一樣作為一個服務基本單元。我們只需要進行如下修改即可。
4.1.1 Config-Server改造
在pom.xml中增加如下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
在配置文件中配置我們服務的名稱,及之前我們所編寫Eureka服務器的地址:
spring.application.name=config-server
eureka.client.service-url.defaultZone=http://localhost:8260/eureka
啟動類:
/**
* TwoStepsFromJava Cloud -- Config Server
*
* @author CD826(CD826Dong@gmail.com)
* @since 1.0.0
*/
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
增加@EnableDiscoveryClient
注解。
Ok,到這里為止,Config-Server修改已經完成。如果我們啟動Config-Server就會在Eureka服務器上看到相應的服務注冊。
4.1.2 Config-Client改造
在pom.xml中增加如下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
配置文件修改,注意這里的配置文件為:bootstrap.properties
:
spring.application.name=mallWeb
spring.cloud.config.profile=dev
eureka.client.service-url.defaultZone=http://localhost:8260/eureka
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server
修改啟動類:
/**
* TwoStepsFromJava Cloud -- Config Client Project
*
* @author CD826(CD826Dong@gmail.com)
* @since 1.0.0
*/
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
這樣就完成了從Eureka中獲取Config-Server的服務信息。
這里最重要的就是在配置中增加: spring.cloud.config.discovery.enabled=true
,并將原來所配置的spring.cloud.config.uri
,修改為spring.cloud.config.discovery.service-id
。
4.2 快速失敗與響應
4.2.1 開啟Config-Server啟動加載
默認情況下,只有當客戶端請求時服務端才會從配置的Git倉庫中進行加載,我們可以通過設置clone-on-start
,讓服務端在啟動時就會加載。
spring.cloud.config.server.git.uri=https://git/common/config-repo.git
spring.cloud.config.server.git.repos.team-a.pattern=team-a-*
spring.cloud.config.server.git.repos.team-a.clone-on-start=true
spring.cloud.config.server.git.repos.team-a.uri=http://git/team-a/config-repo.git
spring.cloud.config.server.git.repos.team-b.pattern=team-b-*
spring.cloud.config.server.git.repos.team-b.clone-on-start=false
spring.cloud.config.server.git.repos.team-b.uri=http://git/team-b/config-repo.git
spring.cloud.config.server.git.repos.team-c.pattern=team-c-*
spring.cloud.config.server.git.repos.team-c.uri=http://git/team-a/config-repo.git
上面的配置,對于team-a
的則在Config-Server啟動時就會加載相應的配置,而對于其它則不會。當然,我們可以通過設置spring.cloud.config.server.git.clone-on-start
的值來進行全局配置。
4.2.2 開啟Config-Client快速失敗
在一些情況下,我們希望啟動一個服務時無法連接到服務端能夠快速返回失敗,那么可以通過下面的配置來設置:
spring.cloud.config.fail-fast=true
4.2.3 設置Config-Client重試
如果在啟動時Config-Server碰巧不可以使用,你還想后面再進行重試,那么我們開始開啟Config-Client的重試機制。首先,我們需要配置:
spring.cloud.config.fail-fast=true
然后,我們需要在我們的的依賴中增加:
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
這樣,我們就可以為Config-Client開啟了重試機制,當啟動連接Config-Server失敗時,Config-Client會繼續嘗試連接Config-Server,默認會嘗試連接6次,時間間隔初始為1000毫秒,后面每次嘗試連接會按照1.1倍數增加嘗試連接時間的間隔,如果最后還不能夠連接到Config-Server才會返回錯誤。我們可以通過在配置文件中復寫spring.cloud.config.retry.*
來進行相關配置。
如果你想全權控制重試機制,可以實現一個類型為:
RetryOperationsInterceptor
的類,并把bean的id設置為:configServerRetryInterceptor
。
4.3 動態刷新配置
Config-Client中提供了一個refresh
端點來實現配置文件的刷新。要想使用該功能,我們需要在Config-Client的pom.xml文件中增加以下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
這樣,當修改配置文件并提交到Git倉庫后,就可以使用:http://localhost:8080/refresh刷新本地的配置數據。
但是,最好的方式還是和Spring Cloud Bus進行整合,這樣才能實現配置的自動分發,而不是需要手工去刷新配置。