一個Spring Boot應用程式可以立即使用Spring Config Server(或應用程式開發人員提供的其他外部屬性源),并且還将擷取與Environment更改事件相關的一些其他有用功能。
1 配置固定伺服器位址
這是使用了Spring Cloud Config Client的任何應用程式的預設行為:當配置用戶端啟動時,它将通過配置伺服器(通過引導配置屬性spring.cloud.config.uri)綁定并使用遠端屬性源初始化Spring Environment。
所有想要使用配置伺服器的用戶端應用程式都要配置bootstrap.yml(或環境變量) 中的spring.cloud.config.uri(預設為“http:// localhost:8888”)。
2 服務發現配置中心
如果您正在使用“DiscoveryClient”元件,例如Spring Cloud Netflix的Eureka Service Discovery或Spring Cloud Consul,那麼您可以讓Config Server注冊到Discovery 服務。但在預設的“配置優先”模式下,用戶端将無法使用注冊功能。
如果您希望使用DiscoveryClient找到Config Server,可以通過設定spring.cloud.config.discovery.enabled=true(預設為“false”)來實作。同時用戶端應用程式都需要在bootstrap.yml(或環境變量)中設定合适屬性。例如,使用Spring Cloud Netflix,您需要定義Eureka伺服器位址(例如eureka.client.serviceUrl.defaultZone)。使用此選項的代價是啟動時額外的網絡請求,以定位服務注冊元件。好處是配置伺服器可以更改其位址,隻要服務發現元件是固定的。預設的服務辨別是“configserver”,但是您可以使用spring.cloud.config.discovery.serviceId在用戶端上進行更改(在伺服器上可以通過設定spring.application.name以通常方式更改服務名)。
服務發現元件都支援某種中繼資料map(例如,對于Eureka,我們有eureka.instance.metadataMap)。可能需要在其服務注冊中繼資料中配置Config Server的一些其他屬性,以便用戶端可以正确連接配接。如果使用HTTP Basic安全配置伺服器,則可以将憑據配置為“user”和“password”。并且如果配置伺服器具有上下文路徑,您可以設定“configPath”。例如,對于作為Eureka用戶端的配置伺服器:
bootstrap.yml
eureka:
instance:
...
metadataMap:
user: osufhalskjrtl
password: lviuhlszvaorhvlo5847
configPath: /config
3 配置用戶端快速失敗
在某些情況下,如果服務無法連接配接到配置伺服器,則可能希望啟動服務失敗。如果這是所需的行為,請設定引導配置屬性spring.cloud.config.failFast=true,用戶端抛出異常并停止。
4 配置用戶端重試
如果您的配置伺服器在您的應用程式啟動時可能偶爾不可用,您可以要求它在發生故障後繼續嘗試。首先,您需要設定spring.cloud.config.failFast=true,然後您需要将spring-retry和spring-boot-starter-aop依賴添加到您的類路徑中。預設行為是重試6次,初始重試間隔為1000ms,指數乘數為1.1,用于後續重試。您可以使用spring.cloud.config.retry.*屬性配置這些屬性(和其他)。
要完全控制重試,請使用id“configServerRetryInterceptor”添加RetryOperationsInterceptor類型的@Bean。Spring Retry有一個RetryInterceptorBuilder,可以輕松建立一個。
5 查找遠端配置資源
配置服務從/{application}/{profile}/{label}提供屬性源,用戶端應用程式中的預設綁定有:
- “name” = ${spring.application.name}
- “profile” = ${spring.profiles.active} (actually Environment.getActiveProfiles())
- “label” = “master”
設定屬性“${spring.application.name}”時,不要使用字首“application-”,避免比對屬性源時出錯。
所有這些都可以通過設定spring.cloud.config.(其中是“name”,“profile”或“label”)來覆寫。“label”可用于復原到以前版本的配置; 使用預設的Config Server實作,它可以是git label,分支名稱或送出ID。label也可以以逗号分隔的清單形式提供。在這種情況下,會逐個嘗試清單中的項目,直到成功。這對于在特征分支上工作時可能很有用。例如,當您可能希望将配置标簽與您的分支對齊,但使其成為可選(如spring.cloud.config.label=myfeature,develop)。
6 配置中心高可用
為了保證配置中心的高可用,你可能會有多個配置中心執行個體,以便實作輪流嘗試。你可以指定多個URL(設定spring.cloud.config.uri,以逗号分隔),或注冊到eureka那樣的注冊中心。
隻有一個配置中心下線或連接配接逾時時,才會嘗試連接配接其它執行個體。比如,如果配置中心傳回一個500錯誤或401(未授權等),用戶端不會嘗試連接配接其它的配置中心執行個體。這類的錯誤通常是由使用者造成的,而不是高可用問題。
如果你的配置中心開啟了http安全認證,你可以在
pring.cloud.config.uri
屬性中為每個配置伺服器配置單獨的認證。但如果你用的是其它的認證機制,目前不能為每個伺服器單獨配置認證。
7 配置逾時時間
如果你想配置逾時時間:
- spring.cloud.config.request-read-timeout 可以設定讀逾時
- spring.cloud.config.request-connect-timeout 可以設定連接配接逾時
8 安全
如果您在伺服器上使用HTTP基本安全認證,那麼用戶端需要知道密碼(如果不是預設使用者名也要提供使用者名)。您可以在伺服器URI中提供使用者名密碼,或通過單獨的username和password屬性設定,例如
bootstrap.yml
spring:
cloud:
config:
uri: https://user:[email protected]
或使用下面的配置:
spring:
cloud:
config:
uri: https://myconfig.mycompany.com
username: user
password: secret
spring.cloud.config.password和spring.cloud.config.username值覆寫URI中提供的所有内容。
如果您在Cloud Foundry部署應用程式,則提供密碼的最佳方式是通過服務憑證(例如URI,因為它甚至不需要在配置檔案中)。下面是在Cloud Foundry上為本地工作的使用者提供的服務的一個例子,名為“configserver”:
bootstrap.yml
spring:
cloud:
config:
uri: ${vcap.services.configserver.credentials.uri:http://user:[email protected]:8888}
如果您使用其它安全認證,則可能需要向ConfigServicePropertySourceLocator提供RestTemplate(例如,通過在引導上下文中擷取并注入一個)。
8.1 健康名額
配置用戶端提供嘗試從配置伺服器加載配置的Spring Boot運作狀況訓示器。可以通過設定health.config.enabled=false來禁用運作狀況訓示器。由于性能原因,響應也被緩存。預設緩存生存時間為5分鐘。要更改該值,請設定health.config.time-to-live屬性(以毫秒為機關)。
8.2 提供自定義RestTemplate
在某些情況下,您可能需要從用戶端自定義對配置伺服器的請求。通常這涉及傳遞特殊的Authorization頭部來對伺服器的請求進行身份驗證。要提供自定義RestTemplate,請按照以下步驟操作。
使用PropertySourceLocator的實作建立一個新的配置bean:
CustomConfigServiceBootstrapConfiguration.java
@Configuration
public class CustomConfigServiceBootstrapConfiguration {
@Bean
public ConfigServicePropertySourceLocator configServicePropertySourceLocator() {
ConfigClientProperties clientProperties = configClientProperties();
ConfigServicePropertySourceLocator configServicePropertySourceLocator = new ConfigServicePropertySourceLocator(clientProperties);
configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties));
return configServicePropertySourceLocator;
}
}
可以設定 spring.cloud.config.headers.* 屬性,可以快速添加 Authorization
頭
在resources/META-INF中建立一個名為spring.factories的檔案,并指定您的自定義配置:
spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration
8.3 Vault
當使用Vault作為配置伺服器的後端時,用戶端将需要為伺服器提供令牌以從Vault中檢索值。可以通過在用戶端的bootstrap.yml中設定spring.cloud.config.token來提供此令牌。
bootstrap.yml
spring:
cloud:
config:
token: YourVaultToken
9 Vault中的嵌套密鑰
Vault支援将鍵嵌入存儲在Vault中的值中。例如
echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -
此指令會将JSON對象寫入您的Vault。要在Spring中通路這些值,在注解使用傳統的點(.)。例如
@Value("${appA.secret}")
String name = "World";
上述代碼将name變量設定為appAsecret。
10 重新整理配置
詳見 手動重新整理配置
Spring Cloud Config 使用說明(1) – 快速開始
Spring Cloud Config 配置中心使用說明(2) – 伺服器+git庫
Spring Cloud Config 配置中心使用說明(3) – 伺服器+檔案存儲
Spring Cloud Config 配置中心使用說明(4) – 伺服器+資料庫存儲
Spring Cloud Config 配置中心使用說明(5) – 伺服器健康與安全配置
Spring Cloud Config 配置中心使用說明(6) – 伺服器 配置檔案格式
Spring Cloud Config 配置中心使用說明(7) – 伺服器 配置變更通知
Spring Cloud Config 配置中心使用說明(8) – 用戶端