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}
,其中name
,profile
和,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>
與環境配置的源文件一樣, |
如果您不想提供
|
8.嵌入配置服務器
Config Server作爲獨立應用程序運行最佳。但是,如果需要,您可以將其嵌入另一個應用程序中。爲此,請使用@EnableConfigServer
註釋。spring.cloud.config.server.bootstrap
在這種情況下,名爲的可選屬性很有用。它是一個標誌,指示服務器是否應該從自己的遠程存儲庫配置自己。默認情況下,該標誌處於關閉狀態,因爲它可能會延遲啓動。但是,當嵌入到另一個應用程序中時,以與任何其他應用程序相同的方式初始化是有意義的。設置時spring.cloud.config.server.bootstrap
,true
還必須使用複合環境存儲庫配置。例如
<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 |
要更改服務器端點的位置,您可以(可選)設置spring.cloud.config.server.prefix
(例如/config
),以便在前綴下提供資源。前綴應該開始但不以a結尾/
。它應用於@RequestMappings
Config Server中(即Spring Boot server.servletPath
和server.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}
模式的應用程序(可以包含通配符)。
該 |
默認配置還檢測本地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
如果您使用DiscoveryClient
Spring 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保護配置服務器,則可以將憑據配置爲user
和password
。此外,如果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-retry
和spring-boot-starter-aop
你的類路徑。默認行爲是重試六次,初始退避間隔爲1000毫秒,指數乘數爲1.1,以便後續退避。您可以通過設置spring.cloud.config.retry.*
配置屬性來配置這些屬性(和其他屬性)。
要完全控制重試行爲,請添加ID爲 |
10.5查找遠程配置資源
Config Service提供屬性源/{name}/{profile}/{label}
,其中客戶端應用程序中的默認綁定如下:
- “名字”=
${spring.application.name}
- “個人資料”=
${spring.profiles.active}
(實際上Environment.getActiveProfiles()
) - “label”=“主人”
設置屬性時, |
您可以通過設置覆蓋所有的人spring.cloud.config.*
(這裏*
是name
,profile
或label
)。這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.password
和spring.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>
如果您使用安全的另一種形式,你可能需要提供RestTemplate
的ConfigServicePropertySourceLocator
(例如,通過在引導方面抓住它,並注入它)。
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
:
- 創建一個具有實現的新配置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>
- 在
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.token
在bootstrap.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
。