1. 程式人生 > >《Spring Cloud Config官方文件》之Spring Cloud Config客戶端

《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

(預設為“false”)來實現。最終的結果是,客戶端應用程式都需要一個 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-retryspring-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.passwordspring.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