Spring Cloud 參考文檔(Spring Cloud Config Client)

Spring Cloud Config Client

Spring Boot應用程序能夠當即利用Spring Config Server(或應用程序開發人員提供的其餘外部屬性源),它還提取了一些與Environment變化事件相關的額外有用特性。java

配置優先Bootstrap

在類路徑上具備Spring Cloud Config Client的任何應用程序的默認行爲以下:當配置客戶端啓動時,它會綁定到Config Server(經過spring.cloud.config.uri bootstrap配置屬性)並使用遠程屬性源初始化Spring Environmentgit

這種行爲的最終結果是,全部想要使用Config Server的客戶端應用程序都須要一個bootstrap.yml(或環境變量),其服務器地址在spring.cloud.config.uri中設置(默認爲「http://localhost:8888" )。spring

發現優先Bootstrap

若是你使用DiscoveryClient實現,例如Spring Cloud Netflix和Eureka Service Discovery或Spring Cloud Consul,你能夠將Config Server註冊到Discovery Service,可是,在默認的「配置優先Bootstrap」模式下,客戶端沒法利用註冊。bootstrap

若是你更喜歡使用DiscoveryClient來定位Config Server,能夠經過設置spring.cloud.config.discovery.enabled=true(默認值爲false)來實現,這樣作的最終結果是客戶端應用程序都須要具備適當發現配置的bootstrap.yml(或環境變量)。例如,使用Spring Cloud Netflix,你須要定義Eureka服務器地址(例如,在eureka.client.serviceUrl.defaultZone中),使用此選項的代價是啓動時額外的網絡往返,以查找服務註冊,好處是,只要Discovery Service是固定點,Config Server就能夠更改其座標。默認服務ID是configserver,但你能夠經過設置spring.cloud.config.discovery.serviceId在客戶端上更改它(在服務器上,以一般的方式提供服務,例如經過設置spring.application.name) 。segmentfault

發現客戶端實現都支持某種元數據映射(例如,咱們爲Eureka提供了eureka.instance.metadataMap),可能須要在其服務註冊元數據中配置Config Server的一些額外屬性,以便客戶端能夠正確鏈接。若是使用HTTP Basic保護Config Server,則能夠將憑據配置爲userpassword,此外,若是Config Server具備上下文路徑,則能夠設置configPath,例如,如下YAML文件用於做爲Eureka客戶端的Config Server:後端

bootstrap.yml緩存

eureka:
  instance:
    ...
    metadataMap:
      user: osufhalskjrtl
      password: lviuhlszvaorhvlo5847
      configPath: /config

Config Client快速失敗

在某些狀況下,若是服務沒法鏈接到Config Server,你可能但願服務啓動失敗,若是這是所需的行爲,請將bootstrap配置屬性spring.cloud.config.fail-fast=true設置爲使客戶端中止並顯示異常。安全

Config Client重試

若是你預期配置服務器在應用程序啓動時偶爾可能不可用,你能夠在失敗後繼續嘗試。首先,你須要設置spring.cloud.config.fail-fast=true,而後,你須要在類路徑中添加spring-retryspring-boot-starter-aop,默認行爲是重試六次,初始回退間隔爲1000毫秒,後續回退的指數乘數爲1.1,你能夠經過設置spring.cloud.config.retry.*配置屬性來配置這些屬性(和其餘屬性)。服務器

要徹底控制重試行爲,請添加一個類型爲 RetryOperationsInterceptor@Bean,其ID爲 configServerRetryInterceptor,Spring Retry有一個 RetryInterceptorBuilder支持建立它。

查找遠程配置資源

Config Service從/{name}/{profile}/{label}提供屬性源,其中客戶端應用程序中的默認綁定以下:網絡

  • 「name」 = ${spring.application.name}
  • 「profile」 = ${spring.profiles.active}(其實是Environment.getActiveProfiles()
  • 「label」 = 「master」
設置屬性 ${spring.application.name}時,不要在應用程序名稱前加上保留字 application-,以防止解析正確的屬性源問題。

你能夠經過設置spring.cloud.config.*來覆蓋全部這些(其中*nameprofilelabel),該label可用於回滾到之前版本的配置,使用默認的Config Server實現,它能夠是git標籤,分支名稱或提交ID。標籤也能夠以逗號分隔列表的形式提供,在這種狀況下,列表中的項目將逐個嘗試,直到成功爲止,在處理特性分支時,此行爲很是有用。例如,你可能但願將配置標籤與你的分支對齊,但使其成爲可選(在這種狀況下,請使用spring.cloud.config.label=myfeature,develop)。

爲Config Server指定多個URL

當你部署了多個Config Server實例並預期一個或多個實例不時不可用時,爲確保高可用性,你能夠指定多個URL(做爲spring.cloud.config.uri屬性下的逗號分隔列表),也可讓全部實例在Eureka等Service Registry中註冊(若是使用發現優先Bootstrap模式)。請注意,只有在Config Server未運行時(即應用程序已退出時)或發生鏈接超時時,才能確保高可用性,例如,若是Config Server返回500(內部服務器錯誤)響應或Config Client從Config Server收到401(因爲憑據錯誤或其餘緣由),則Config Client不會嘗試從其餘URL獲取屬性,這種錯誤表示用戶問題而不是可用性問題。

若是在Config Server上使用HTTP基本安全性,則僅當你在spring.cloud.config.uri屬性下指定的每一個URL中嵌入憑據時,才能支持每一個Config Server身份驗證憑據,若是使用任何其餘類型的安全機制,則沒法(目前)支持每一個Config Server身份驗證和受權。

配置讀取超時

若是要配置讀取超時,可使用屬性spring.cloud.config.request-read-timeout來完成此操做。

安全性

若是你在服務器上使用HTTP Basic安全性,客戶端須要知道密碼(若是不是默認值,則須要用戶名),你能夠經過配置服務器URI或單獨的用戶名和密碼屬性指定用戶名和密碼,如如下示例所示:

bootstrap.yml

spring:
  cloud:
    config:
     uri: https://user:secret@myconfig.mycompany.com

如下示例顯示了傳遞相同信息的另外一種方法:

bootstrap.yml

spring:
  cloud:
    config:
     uri: https://myconfig.mycompany.com
     username: user
     password: secret

spring.cloud.config.passwordspring.cloud.config.username值覆蓋URI中提供的任何內容。

若是你在Cloud Foundry上部署應用程序,提供密碼的最佳方式是經過服務憑據(例如在URI中,由於它不須要在配置文件中),如下示例在本地運行,並在名爲configserver的Cloud Foundry上爲用戶提供服務:

bootstrap.yml

spring:
  cloud:
    config:
     uri: ${vcap.services.configserver.credentials.uri:http://user:password@localhost:8888}

若是你使用其餘形式的安全性,則可能須要向ConfigServicePropertySourceLocator提供一個RestTemplate(例如,經過在引導程序上下文中獲取它並注入它)。

健康指示器

Config Client提供嘗試從Config Server加載配置的Spring Boot Health Indicator,能夠經過設置health.config.enabled=false來禁用健康指示器,出於性能緣由,還會緩存響應,生存的默認緩存時間爲5分鐘,要更改該值,請設置health.config.time-to-live屬性(以毫秒爲單位)。

提供自定義RestTemplate

在某些狀況下,你可能須要自定義從客戶端向配置服務器發出的請求,一般,這樣作涉及傳遞特殊的Authorization headers來驗證對服務器的請求,要提供自定義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;
    }
}
  • resources/META-INF中,建立一個名爲spring.factories的文件並指定自定義配置,如如下示例所示:

spring.factories

org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration

Vault

使用Vault做爲配置服務器的後端時,客戶端須要爲服務器提供令牌以從Vault檢索值,能夠經過在bootstrap.yml中設置spring.cloud.config.token在客戶端內提供此令牌,如如下示例所示:

bootstrap.yml

spring:
  cloud:
    config:
      token: YourVaultToken

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


上一篇:推送通知和Spring Cloud Bus

下一篇:服務發現:Eureka客戶端

相關文章
相關標籤/搜索