天天看點

Spring Cloud Config 配置中心使用說明(8) -- 用戶端1 配置固定伺服器位址2 服務發現配置中心3 配置用戶端快速失敗4 配置用戶端重試5 查找遠端配置資源6 配置中心高可用7 配置逾時時間8 安全8.3 Vault9 Vault中的嵌套密鑰10 重新整理配置

一個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) – 用戶端

繼續閱讀