《Spring Cloud Config官方文件》之Spring Cloud Config客戶端
10. Spring Cloud Config客戶端
Spring Boot應用程式可以立即利用Spring Config伺服器(或應用程式開發人員提供的其他外部屬性資源),還可以獲取與Environment
更改事件有關的一些其他有用的功能。
10.1 配置第一引導
這是在類路徑上具有Spring Cloud Config Client的任何應用程式的預設行為。當一個配置客戶端啟動時,它繫結到配置伺服器(通過引導配置屬性spring.cloud.config.uri
),並用遠端屬性來初始化Spring Environment
。
這樣做的最終結果是,所有想要使用配置伺服器的客戶端應用程式都需要一個bootstrap.yml
spring.cloud.config.uri
(預設為“http:// localhost:8888”)。
10.2 發現第一引導
如果您正在使用“DiscoveryClient”實現,例如Spring Cloud Netflix和Eureka服務發現或Spring Cloud Consul(Spring Cloud Zookeeper 不支援此功能),則可以讓Config Server在發現服務中進行註冊(如果需要),但在預設的“配置優先”模式下,客戶端將無法利用註冊。
如果您更喜歡用DiscoveryClient
來定位配置伺服器,可以通過設定spring.cloud.config.discovery.enabled=true
bootstrap.yml
(或一個環境變數)與適當的發現配置。例如,使用Spring Cloud Netflix,您需要定義Eureka伺服器地址,例如eureka.client.serviceUrl.defaultZone
。使用此選項的代價是在啟動時進行額外的網路往返查詢服務註冊。好處是配置伺服器可以改變它的座標,前提是發現服務是一個固定的點。預設的服務ID是“configserver”,但是你可以採用spring.cloud.config.discovery.serviceId
在伺服器上用伺服器修改服務(例如通過設定伺服器spring.application.name
發現客戶端實現都支援某種型別的元資料對映(例如我們擁有的Eureka eureka.instance.metadataMap
)。Config伺服器的一些其他屬性可能需要在其服務註冊元資料中進行配置,以便客戶端可以正確連線。如果Config Server使用HTTP Basic進行安全保護,則可以將憑證配置為“使用者名稱”和“密碼”。如果配置伺服器有一個上下文路徑,你可以設定“configPath”。例如,對於作為Eureka客戶端的Config伺服器:
bootstrap.yml。
eureka:
instance:
...
metadataMap:
user: osufhalskjrtl
password: lviuhlszvaorhvlo5847
configPath: /config
10.3 配置客戶端快速失敗
在某些情況下,如果服務無法連線到配置伺服器,則可能需要啟動服務失敗。如果這是所需的行為,請設定載入程式配置屬性 spring.cloud.config.failFast=true
,客戶端將通過異常暫停使用。
10.4 配置客戶端重試
如果您希望在您的應用程式啟動時配置伺服器可能偶爾不可用,則可以要求它在發生故障後繼續嘗試。首先你需要設定spring.cloud.config.failFast=true
,然後你需要新增 spring-retry
和spring-boot-starter-aop
到你的類路徑。預設行為是重試6次,初始回退間隔為1000ms,後續回退的指數乘數為1.1。您可以使用spring.cloud.config.retry.*
配置屬性來配置這些屬性(和其他屬性)。
要完全控制重試,請新增一個ID為“configServerRetryInterceptor” 的型別為
RetryOperationsInterceptord
的@Bean
。Spring Retry有一個RetryInterceptorBuilder
,這將很容易建立。
10.5 查詢遠端配置資源
配置服務提供來自/{name}/{profile}/{label}
的屬性來源,客戶端應用程式的預設繫結如下:
- “name” =
${spring.application.name}
- “profile” =
${spring.profiles.active}
(實際上Environment.getActiveProfiles()
) - “label” = “master”
所有這些都可以通過設定spring.cloud.config.*
(其中*
是“名稱”,“配置檔案”或“標籤”)來覆蓋。“標籤”對回滾到以前版本的配置非常有用; 與預設的配置伺服器實現它可以是一個git標籤,分支名稱或提交ID。也可以將標籤作為逗號分隔列表提供,在這種情況下,列表中的專案將逐個嘗試,直到成功完成為止。這在處理特性分支時非常有用,例如,當你想要將分配標籤與你的分支對齊時,使其成為可選的(例如spring.cloud.config.label=myfeature,develop
)。
10.6 安全
如果您在伺服器上使用HTTP Basic安全性,則客戶端只需知道密碼(如果不是預設密碼,則需要輸入使用者名稱)。你可以通過配置伺服器URI,或通過單獨的使用者名稱和密碼屬性,例如
bootstrap.yml。
spring:
cloud:
config:
uri:https:// user:[email protected]
或者是
bootstrap.yml。
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:password @ localhost :8888 }
如果您使用安全的另一種形式,你可能需要提供 RestTemplate
到ConfigServicePropertySourceLocator
(在引導方面抓住它,並注入一個EG)。
10.6.1 健康指標
Config客戶端提供了一個Spring Boot Health Indicator,它試圖從配置伺服器載入配置。健康指示器可以通過設定health.config.enabled=false
來禁用。由於效能原因,響應也被快取。預設的快取時間是5分鐘。要更改該值,請設定該health.config.time-to-live
屬性(以毫秒為單位)。
10.6.2 提供自定義RestTemplate
在某些情況下,您可能需要自定義從客戶端向配置伺服器發出的請求。通常這包括傳遞特殊的Authorization
頭來驗證對伺服器的請求。要提供自定義RestTemplate
,請按照以下步驟操作。
1.用一個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;
}
}
1.在resources/META-INF
建立一個名為spring.factories
的檔案,並指定您的自定義配置。 spring.factories。
org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration
10.6.3 保險庫
將Vault用作配置伺服器的後端時,客戶端需要為伺服器提供令牌以從Vault檢索值。此令牌可在客戶端內在bootstrap.yml
中通過設定spring.cloud.config.token
來提供。
bootstrap.yml。
spring:
cloud:
config:
token:YourVaultToken
10.7 Vault
10.7.1 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
。