Spring Cloud Document翻譯(四)--Spring Cloud Config 2

https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/multi/multi__serving_alternative_formats.html

6.提供替代格式

來自環境端點的默認JSON格式非常適合Spring應用程序使用,因爲它直接映射到Environment抽象上。如果您願意,可以通過向資源路徑添加後綴(“.yml”,“。yaml”或“.properties”)來使用與YAML或Java屬性相同的數據。對於不關心JSON端點結構或它們提供的額外元數據的應用程序來說,這可能很有用(例如,不使用Spring的應用程序可能會受益於此方法的簡單性)。

YAML和屬性表示有一個額外的標誌(作爲一個布爾查詢參數提供resolvePlaceholders),表示源文檔中的佔位符(在標準的Spring ${…​}表單中)應該在渲染之前在輸出中解析,如果可能的話。對於不瞭解Spring佔位符約定的消費者而言,這是一個有用的功能。

[注意]

使用YAML或屬性格式存在限制,主要與元數據丟失有關。例如,JSON的結構爲屬性源的有序列表,其名稱與源相關。即使值的來源具有多個源,並且原始源文件的名稱丟失,YAML和屬性表單也會合併爲單個映射。此外,YAML表示不一定是支持存儲庫中YAML源的忠實表示。它由一系列扁平的財產來源構成,並且必須對鑰匙的形式做出假設。

 

7.提供純文本

Environment您的應用程序可能需要根據其環境定製的通用純文本配置文件,而不是使用抽象(或YAML或屬性格式中的替代表示之一)。Config Server通過一個額外的端點提供這些端點/{name}/{profile}/{label}/{path},其中nameprofile和,label具有與常規環境端點相同的含義,但它path是一個文件名(例如log.xml)。此端點的源文件的位置與環境端點的方式相同。相同的搜索路徑用於屬性和YAML文件。但是,不是聚合所有匹配的資源,而是僅返回要匹配的第一個。

找到資源後,${…​}通過使用Environment提供的應用程序名稱,配置文件和標籤的有效來解析普通格式()中的佔位符。通過這種方式,資源端點與環境端點緊密集成。請考慮以下GIT或SVN存儲庫示例:

<span style="color:#000000">application.yml
nginx.conf</span>

這裏nginx.conf看起來是這樣的:

<span style="color:#000000">服務器{
    聽80;
    server_name $ {nginx.server.name};
}</span>

application.yml這樣:

<span style="color:#000000"><span style="color:#7f007f">nginx</span>:
 <span style="color:#7f007f">  server</span>:
 <span style="color:#7f007f">    name</span>:example.com
 <span style="color:#3f5f5f"><em>--- </em></span>
<span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  profiles</span>:development
 <span style="color:#7f007f">nginx</span>:
 <span style="color:#7f007f">  server</span>:
 <span style="color:#7f007f">    name</span>:develop.com</span>

/foo/default/master/nginx.conf資源可能如下:

<span style="color:#000000">服務器{
    聽80;
    server_name example.com;
}</span>

/foo/development/master/nginx.conf這樣:

<span style="color:#000000">服務器{
    聽80;
    server_name develop.com;
}</span>
[注意]

與環境配置的源文件一樣,profile它用於解析文件名。因此,如果您想要一個特定於配置文件的文件,/*/development/*/logback.xml可以通過一個名爲logback-development.xml(優先logback.xml)的文件來解析。

[注意]

如果您不想提供label並讓服務器使用默認標籤,則可以提供useDefaultLabel請求參數。因此,前面的default配置文件示例可能是/foo/default/nginx.conf?useDefaultLabel

 

 

8.嵌入配置服務器

Config Server作爲獨立應用程序運行最佳。但是,如果需要,您可以將其嵌入另一個應用程序中。爲此,請使用@EnableConfigServer註釋。spring.cloud.config.server.bootstrap在這種情況下,名爲的可選屬性很有用。它是一個標誌,指示服務器是否應該從自己的遠程存儲庫配置自己。默認情況下,該標誌處於關閉狀態,因爲它可能會延遲啓動。但是,當嵌入到另一個應用程序中時,以與任何其他應用程序相同的方式初始化是有意義的。設置時spring.cloud.config.server.bootstraptrue還必須使用複合環境存儲庫配置。例如

<span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  application</span>:
 <span style="color:#7f007f">    name</span>:configserver
 <span style="color:#7f007f">  profiles</span>:
 <span style="color:#7f007f">    active</span>:composite
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      server</span>:
 <span style="color:#7f007f">        composite</span>:
 <span style="color:#7f007f">          -  type</span>:native
 <span style="color:#7f007f">            search-locations</span>:$ {HOME} / Desktop / config
 <span style="color:#7f007f">        bootstrap</span>:<span style="color:#7f0055"><strong>true</strong></span></span>
[注意]

如果使用bootstrap標誌,則配置服務器需要配置其名稱和存儲庫URI bootstrap.yml

要更改服務器端點的位置,您可以(可選)設置spring.cloud.config.server.prefix(例如/config),以便在前綴下提供資源。前綴應該開始但不以a結尾/。它應用於@RequestMappingsConfig Server中(即Spring Boot server.servletPathserver.contextPath前綴下面)。

如果要直接從後端存儲庫(而不是從配置服務器)讀取應用程序的配置,您基本上需要一個沒有端點的嵌入式配置服務器。您可以通過不使用@EnableConfigServer註釋(set spring.cloud.config.server.bootstrap=true)完全關閉端點。

9.推送通知和Spring Cloud Bus

許多源代碼存儲庫提供程序(例如Github,Gitlab,Gitea,Gitee,Gogs或Bitbucket)通過webhook通知您存儲庫中的更改。您可以通過提供程序的用戶界面將webhook配置爲URL以及您感興趣的一組事件。例如,Github使用POST給webhook,其中JSON正文包含一個提交列表和一個header(X-Github-Event)設置爲push。如果在spring-cloud-config-monitor庫中添加依賴項並在Config Server中激活Spring Cloud Bus,則會/monitor啓用端點。

激活webhook後,Config Server會RefreshRemoteApplicationEvent針對它認爲可能已更改的應用程序發送目標。可以制定變化檢測策略。但是,默認情況下,它會查找與應用程序名稱匹配的文件中的更改(例如,foo.properties針對foo應用程序,而application.properties針對所有應用程序)。要覆蓋行爲時使用的策略是PropertyPathNotificationExtractor,它接受請求標頭和正文作爲參數,並返回已更改的文件路徑列表。

默認配置與Github,Gitlab,Gitea,Gitee,Gogs或Bitbucket開箱即用。除了來自Github,Gitlab,Gitee或Bitbucket的JSON通知之外,您還可以通過POST來/monitor使用模式中的表單編碼的body參數來觸發更改通知path={name}。這樣做會廣播到匹配{name}模式的應用程序(可以包含通配符)。

[注意]

RefreshRemoteApplicationEvent如果只傳輸spring-cloud-bus是在兩個配置服務器和客戶端應用程序激活。

[注意]

默認配置還檢測本地git存儲庫中的文件系統更改。在這種情況下,不使用webhook。但是,只要編輯配置文件,就會廣播刷新。

 

10. Spring Cloud Config客戶端

Spring Boot應用程序可以立即利用Spring Config Server(或應用程序開發人員提供的其他外部屬性源)。它還提供了一些與Environment更改事件相關的其他有用功能。

10.1配置第一個引導程序

在類路徑上具有Spring Cloud Config Client的任何應用程序的默認行爲如下所示:當配置客戶端啓動時,它將綁定到Config Server(通過spring.cloud.config.uri引導程序配置屬性)並Environment使用遠程屬性源初始化Spring 。

此行爲的最終結果是,所有想要使用Config Server的客戶端應用程序都需要一個bootstrap.yml(或環境變量)設置的服務器地址spring.cloud.config.uri(默認爲“http:// localhost:8888”)。

10.2 Discovery First Bootstrap

如果您使用DiscoveryClientSpring Cloud Netflix和Eureka Service Discovery或Spring Cloud Consul等實施,則可以將Config Server註冊到Discovery Service。但是,在默認的“ Config First ”模式下,客戶端無法利用註冊。

如果您更喜歡使用DiscoveryClient以找到配置服務器,可以通過設置spring.cloud.config.discovery.enabled=true(默認值爲false)來實現。這樣做的最終結果是客戶端應用程序都需要bootstrap.yml具有適當發現配置的(或環境變量)。例如,使用Spring Cloud Netflix,您需要定義Eureka服務器地址(例如,in eureka.client.serviceUrl.defaultZone)。使用此選項的價格是啓動時額外的網絡往返,以查找服務註冊。好處是,只要發現服務是固定點,配置服務器就可以更改其座標。默認服務ID是configserver,但您可以通過設置spring.cloud.config.discovery.serviceId(在服務器上,以通常的方式爲服務,例如通過設置spring.application.name)在客戶端上更改它。

發現客戶端實現都支持某種元數據映射(例如,我們eureka.instance.metadataMap爲Eureka提供)。可能需要在其服務註冊元數據中配置Config Server的一些其他屬性,以便客戶端可以正確連接。如果使用HTTP Basic保護配置服務器,則可以將憑據配置爲userpassword。此外,如果Config Server具有上下文路徑,則可以進行設置configPath。例如,以下YAML文件用於作爲Eureka客戶端的Config Server:

bootstrap.yml。 

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">尤里卡</span>:
 <span style="color:#7f007f">  實例</span>:
    ...
<span style="color:#7f007f">    metadataMap</span>:
 <span style="color:#7f007f">      user</span>:osufhalskjrtl
 <span style="color:#7f007f">      密碼</span>:lviuhlszvaorhvlo5847
 <span style="color:#7f007f">      configPath</span>:/ config</span></span>

 

10.3配置客戶端快速失敗

在某些情況下,如果服務無法連接到Config Server,您可能希望無法啓動服務。如果這是所需的行爲,請設置bootstrap配置屬性spring.cloud.config.fail-fast=true以使客戶端停止並顯示異常。

10.4配置客戶端重試

如果您希望配置服務器在應用程序啓動時偶爾可能不可用,您可以在失敗後繼續嘗試。首先,你需要設置spring.cloud.config.fail-fast=true。然後你需要添加spring-retryspring-boot-starter-aop你的類路徑。默認行爲是重試六次,初始退避間隔爲1000毫秒,指數乘數爲1.1,以便後續退避。您可以通過設置spring.cloud.config.retry.*配置屬性來配置這些屬性(和其他屬性)。

[小費]

要完全控制重試行爲,請添加ID爲@Bean的類型。Spring Retry有一個支持創建一個。RetryOperationsInterceptorconfigServerRetryInterceptorRetryInterceptorBuilder

10.5查找遠程配置資源

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

  • “名字”= ${spring.application.name}
  • “個人資料”= ${spring.profiles.active}(實際上Environment.getActiveProfiles()
  • “label”=“主人”
[注意]

設置屬性時,${spring.application.name}請不要在應用程序名稱前加上保留字,application-以防止問題解決正確的屬性源。

您可以通過設置覆蓋所有的人spring.cloud.config.*(這裏*nameprofilelabel)。這label對於回滾到以前版本的配置很有用。使用默認的Config Server實現,它可以是git標籤,分支名稱或提交ID。Label也可以以逗號分隔列表的形式提供。在這種情況下,列表中的項目將逐個嘗試,直到成功爲止。在處理功能分支時,此行爲非常有用。例如,您可能希望將配置標籤與您的分支對齊,但使其成爲可選(在這種情況下,使用spring.cloud.config.label=myfeature,develop)。

10.6爲Config Server指定多個URL

爲了確保在部署了多個Config Server實例並期望一個或多個實例不時不可用時的高可用性,您可以指定多個URL(作爲逗號分隔列表下的spring.cloud.config.uri或者讓所有實例在Eureka等服務註冊表中註冊(如果使用Discovery-First 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身份驗證和授權。

10.7配置超時

如果要配置超時閾值:

  • 可以使用屬性配置讀取超時spring.cloud.config.request-read-timeout
  • 可以使用屬性配置連接超時spring.cloud.config.request-connect-timeout

10.8安全

如果在服務器上使用HTTP Basic安全性,則客戶端需要知道密碼(如果不是默認密碼,則需要知道用戶名)。您可以通過配置服務器URI或單獨的用戶名和密碼屬性指定用戶名和密碼,如以下示例所示:

bootstrap.yml。 

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">     uri</span>:https:// user:[email protected]</span></span>

 

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

bootstrap.yml。 

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:<span style="color:#7f007f">     uri</span>:https
 :
 <span style="color:#7f007f">//myconfig.mycompany.com </span><span style="color:#7f007f">     用戶名</span>:用戶
 <span style="color:#7f007f">     密碼</span>:secret</span></span>

 

spring.cloud.config.passwordspring.cloud.config.username值將覆蓋在URI中提供的任何東西。

如果您在Cloud Foundry上部署應用程序,則提供密碼的最佳方式是通過服務憑據(例如在URI中,因爲它不需要位於配置文件中)。以下示例適用於本地以及Cloud Foundry上用戶提供的服務,名爲configserver

bootstrap.yml。 

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">     uri</span>:$ {vcap.services.configserver.credentials.uri:http:// user:password @ localhost :8888 <span style="color:#7f0055"><strong>}</strong></span></span></span>

 

如果您使用安全的另一種形式,你可能需要提供RestTemplateConfigServicePropertySourceLocator(例如,通過在引導方面抓住它,並注入它)。

10.8.1健康指標

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

10.8.2提供自定義RestTemplate

在某些情況下,您可能需要自定義從客戶端向配置服務器發出的請求。通常,這樣做涉及傳遞特殊Authorization標頭以驗證對服務器的請求。提供自定義RestTemplate

  1. 創建一個具有實現的新配置bean PropertySourceLocator,如以下示例所示:

CustomConfigServiceBootstrapConfiguration.java。 

<span style="color:#333333"><span style="color:#000000"><em><span style="color:gray">@Configuration</span></em>
<span style="color:#7f0055"><strong> public </strong></span> <span style="color:#7f0055"><strong>class</strong></span> CustomConfigServiceBootstrapConfiguration {
    <em><span style="color:gray"> @Bean</span></em>
    <span style="color:#7f0055"><strong> public</strong></span> ConfigServicePropertySourceLocator configServicePropertySourceLocator(){
        ConfigClientProperties clientProperties = configClientProperties();
       ConfigServicePropertySourceLocator configServicePropertySourceLocator =   <span style="color:#7f0055"><strong>new</strong></span> ConfigServicePropertySourceLocator(clientProperties);
        configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties));
        <span style="color:#7f0055"><strong>return</strong></span> configServicePropertySourceLocator;
    }
}</span></span>

 

  1. resources/META-INF,創建一個名爲的文件 spring.factories並指定自定義配置,如以下示例所示:

spring.factories。 

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">org.springframework.cloud.bootstrap.BootstrapConfiguration</span> = com.my.config.client.CustomConfigServiceBootstrapConfiguration</span></span>

 

10.8.3保險櫃

使用Vault作爲配置服務器的後端時,客戶端需要爲服務器提供令牌以從Vault檢索值。該令牌可以在客戶端內設置被提供spring.cloud.config.tokenbootstrap.yml,如顯示在下面的例子:

bootstrap.yml。 

<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
 <span style="color:#7f007f">  cloud</span>:
 <span style="color:#7f007f">    config</span>:
 <span style="color:#7f007f">      token</span>:YourVaultToken</span></span>

 

10.9 Vault中的嵌套密鑰

Vault支持將密鑰嵌套在Vault中存儲的值中,如以下示例所示:

echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -

此命令將JSON對象寫入Vault。要在Spring中訪問這些值,可以使用傳統的dot(.)註釋,如以下示例所示

<span style="color:#333333"><span style="color:#000000"><em><span style="color:gray">@Value(“$ {appA.secret}”)</span></em> 
String name =<span style="color:#2a00ff"> “World”</span> ;</span></span>

前面的代碼會將name變量的值設置爲appAsecret

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章