4. Spring Cloud Config
Hoxton.SR3
Spring Cloud Config爲分佈式系統中的外部化配置提供了服務器端和客戶端支持。有了Config Server,您就有了一箇中心位置來管理跨所有環境的應用程序的外部屬性。客戶機和服務器上的概念與Spring環境和PropertySource抽象完全相同,因此它們非常適合Spring應用程序,但可以用於以任何語言運行的任何應用程序。當應用程序通過部署管道從dev遷移到測試並進入生產環境時,您可以管理這些環境之間的配置,並確保應用程序在遷移時擁有所需的一切。服務器存儲後端默認的實現使用git,因此它很容易支持配置環境的標記版本,並且可以訪問各種各樣的工具來管理內容。很容易添加替代實現並將它們插入Spring配置中。
4.1. Quick Start
http請求可以通過以下方式獲取資源:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
application:spring.config.name
profile:an active profile (dev/repo)
label : an optional git label(defaults to master)
Spring Cloud Config Server從各種源獲取遠程客戶端的配置。下面的示例從git存儲庫獲取配置(必須提供配置),如下面的示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
4.1.1. Client Side Usage
要在應用程序中使用這些特性,可以將其構建爲依賴於Spring -cloud-config-client的Spring boot應用程序。添加依賴項最方便的方法是使用Spring boot start org.springframe .cloud: Spring -cloud-starter-config
。對於Maven用戶,還有一個父pom和BOM (Spring -cloud-starter-parent),對於Gradle和Spring CLI用戶,還有一個Spring IO版本管理屬性文件。下面的例子展示了一個典型的Maven配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>{spring-boot-docs-version}</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>{spring-cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- repositories also needed for snapshots and milestones -->
現在您可以創建一個標準的Spring啓動應用程序,如以下HTTP服務器:
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
當此HTTP服務器運行時,它從端口8888上的默認本地配置服務器(如果它正在運行)獲取外部配置。你可以通過bootstrap.properties
(和application.properties
類似,但用於應用程序上下文的引導階段)配置來改變config server 的位置來改變其啓動行爲,如下:
spring.cloud.config.uri: http://myconfigserver.com
默認情況下,如果application name沒有設置,那麼會使用application,可以在bootstrap.properties文件中添加下面這個屬性來修改:
spring.application.name: myapp
在設置屬性${spring.application.name}時,不要在應用程序名稱前加上保留字前綴application—
以防止問題解決於正確的屬性源。
引導屬性在/env端點中顯示爲高優先級屬性源,如下面的示例所示:
$ curl localhost:8080/env
{
"profiles":[],
"configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"},
"servletContextInitParams":{},
"systemProperties":{...},
...
}
名爲configService:/的屬性源包含foo屬性,其值爲bar,是最高優先級。
屬性源名稱中的URL是git存儲庫,而不是config server的URL。
4.2. Spring Cloud Config Server
Spring Cloud Config Server爲外部配置(名稱-值對或等效的YAML內容)提供了一個基於HTTP資源的API。通過使用@EnableConfigServer註釋,服務器可以嵌入到Spring Boot應用程序中。因此,下面的應用程序是一個配置服務器:
ConfigServer.java
@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
public static void main(String[] args) {
SpringApplication.run(ConfigServer.class, args);
}
}
和所有spring boot應用一樣,它默認運行在8080端口,但是您可以通過各種方式將其切換到更傳統的端口8888。最簡單的方法是使用spring.config.name=configserver啓動它,它也設置了一個默認的配置存儲庫( 在Config Server jar中有一個默認的configserver.yml文件)。另一種方法是使用您自己的application.properties如下例所示:
application.properties
server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo
{user.home}/config-repo),則需要在文件URL中添加一個額外的“/”。*
4.2.1. Environment Repository
應該將配置服務器的配置數據存儲在哪裏?管理這種行爲的策略是環境存儲庫,它服務於環境對象。該環境是從Spring環境(包括propertySources作爲主要特性)複製域的淺版本。這些環境資源用三個變量進行參數化:
- {application} 與客戶端(config server)的spring.application.name配置對應。
- {profile} 與客戶端的spring.profiles.active對應(多個文件以逗號分隔)。
- {label} 一個服務端(默認情況是git)屬性,用來標識一組文件的“version”。
配置的一般實現方式和一個spring boot程序類似,通過匹配{application}等於spring.application.name,{profiles}等於spring.profiles.active來加載配置文件組,配置文件組的優先級規則也與spring boot程序類似,優先級搞的配置會進行覆蓋,如果有多個配置文件,那麼後面的將覆蓋前面的(和map裏面放entity類似)。
下面的示例客戶端應用程序有這樣的引導配置:
bootstrap.yml
spring:
application:
name: foo
profiles:
active: dev,mysql
(與Spring引導應用程序一樣,這些屬性也可以由環境變量或命令行參數設置)。
如果存儲庫是基於文件的,服務器將從應用程序創建一個application.yml(在所有客戶端之間共享)和foo.yml(foo.yml採取優先)。如果YAML文件內部有指向Spring配置文件的文檔,那麼這些文件將具有更高的優先級(按照列出的配置文件的順序)。如果存在特定於配置文件的YAML(或屬性)文件,則這些文件的優先級也高於默認值。較高的優先級轉換爲環境中較早列出的PropertySource。(這些規則同樣適用於獨立的Spring Boot應用程序。)
你可以設置spring.cloud.config.server。accept-empty變爲false,這樣如果沒有找到應用程序,服務器將返回HTTP 404狀態。默認情況下,此標誌設置爲true。
Git Backend
EnvironmentRepository的默認實現使用Git後端,這對於管理升級和物理環境以及審計更改非常方便。要更改存儲庫的位置,可以設置spring.cloud.config.server.git。配置服務器中的uri配置屬性(例如application.yml)。如果您使用file:前綴設置它,那麼它應該可以在本地存儲庫中工作,這樣您就可以在沒有服務器的情況下快速輕鬆地啓動它。但是,在這種情況下,服務器直接操作本地存儲庫,而不進行克隆(如果它不是裸的,也沒關係,因爲配置服務器從不對“遠程”存儲庫進行更改)。爲了擴展配置服務器並使其具有高可用性,您需要讓服務器的所有實例都指向相同的存儲庫,因此,只有共享文件系統才能工作。即使在這種情況下,最好使用共享文件系統存儲庫的ssh:協議,以便服務器可以克隆它並使用本地工作副本作爲緩存。
這個存儲庫實現將HTTP資源的{label}參數映射到一個git標籤(提交id、分支名稱或標記)。如果git分支或標記名包含一個斜槓(/),那麼應該使用特殊的字符串(_)
來指定HTTP URL中的標籤(以避免與其他URL路徑混淆)。例如,如果標籤是foo/bar,那麼替換斜槓將會產生以下標籤:foo(_)
bar。包含特殊字符串(_)
也可以應用於{application}參數。如果您使用命令行客戶機(如curl),請注意URL中的括號—應該使用單引號(")將它們從shell中轉義。
Skipping SSL Certificate Validation
可以通過設置git.skipSslValidation屬性爲真(默認爲假)來禁用配置服務器對Git服務器的SSL證書的驗證:
spring:
cloud:
config:
server:
git:
uri: https://example.com/my/repo
skipSslValidation: true
Setting HTTP Connection Timeout
您可以配置配置服務器等待獲取HTTP連接的時間(以秒爲單位)。使用git.timeout屬性:
spring:
cloud:
config:
server:
git:
uri: https://example.com/my/repo
timeout: 4
Placeholders in Git URI
Spring Cloud Config Server支持git存儲庫URL,它爲{application}和{profile}提供了佔位符(如果需要,還可以爲{label}提供佔位符,但是請記住,這個標籤是作爲git標籤應用的)。因此,你可以支持“一個應用程序一個庫”的政策,使用類似的結構如下:
spring:
cloud:
config:
server:
git:
uri: https://github.com/myorg/{application}
您還可以使用類似的模式,但使用{profile}來支持“每個概要文件一個存儲庫”策略。
此外,在{application}參數中使用特殊字符串“(_)”可以支持多個組織,如下例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/{application}
在請求時以以下格式提供{application}:organization(_)application。
Pattern Matching and Multiple Repositories
Spring Cloud配置還支持對應用程序和配置文件名稱進行模式匹配的更復雜需求。模式格式是一個以逗號分隔的帶有通配符的{application}/{profile}名稱列表(注意,以通配符開頭的模式可能需要加引號),如下面的示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
repos:
simple: https://github.com/simple/config-repo
special:
pattern: special*/dev*,*special*/dev*
uri: https://github.com/special/config-repo
local:
pattern: local*
uri: file:/home/configsvc/config-repo
如果{application}/{profile}不匹配任何模式,它使用下面定義的缺省URIspring.cloud.config.server.git.uri
,在上面的例子中,對於“simple”存儲庫,模式是simple/*(它只匹配所有配置文件中一個名爲simple的應用程序)。“local”存儲庫匹配所有配置文件中以local開頭的所有應用程序名稱(/*後綴自動添加到沒有配置文件匹配器的任何模式中)。
!!! “簡單”示例中使用的“一行程序”捷徑只有在要設置的惟一屬性是URI時才能使用。如果需要設置其他內容(憑證、模式等),則需要使用完整的表單。
repo中的模式屬性實際上是一個數組,因此可以使用YAML數組(或屬性文件中的[0]、[1]等後綴)綁定到多個模式。你可能需要這樣做,如果你要運行多個配置文件的應用程序,如下例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
repos:
development:
pattern:
- '*/development'
- '*/staging'
uri: https://github.com/development/config-repo
staging:
pattern:
- '*/qa'
- '*/production'
uri: https://github.com/staging/config-repo
!!! Spring Cloud猜測,包含未以結尾的概要文件的模式意味着您實際上希望匹配以該模式開始的概要文件列表(因此*/staging是["/staging"、"/staging,"等的快捷方式)。這種情況很常見,例如,您需要在本地的“開發”配置文件中運行應用程序,但也需要在遠程的“雲”配置文件中運行應用程序。
每個存儲庫還可以選擇將配置文件存儲在子目錄中,並且可以將搜索這些目錄的模式指定爲searchPaths。下面的例子展示了頂層的配置文件:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
searchPaths: foo,bar*
在前面的示例中,服務器在頂層和foo/子目錄中搜索配置文件,以及名稱以bar開頭的任何子目錄。
默認情況下,服務器在第一次請求配置時克隆遠程存儲庫。服務器可以配置爲在啓動時克隆存儲庫,如下面的頂級示例所示:
spring:
cloud:
config:
server:
git:
uri: https://git/common/config-repo.git
repos:
team-a:
pattern: team-a-*
cloneOnStart: true
uri: https://git/team-a/config-repo.git
team-b:
pattern: team-b-*
cloneOnStart: false
uri: https://git/team-b/config-repo.git
team-c:
pattern: team-c-*
uri: https://git/team-a/config-repo.git
在前面的示例中,服務器在啓動時克隆team-a的config-repo,然後才接受任何請求。在從存儲庫請求配置之前,不會克隆所有其他存儲庫。
!!! 在配置服務器啓動時設置要克隆的存儲庫,可以幫助在配置服務器啓動時快速識別配置錯誤的配置源(例如無效的存儲庫URI)。由於沒有爲配置源啓用cloneOnStart,配置服務器可能會使用配置錯誤或無效的配置源成功啓動,並且直到應用程序從配置源請求配置時才檢測到錯誤。
Authentication
要在遠程存儲庫上使用HTTP基本身份驗證,請分別添加用戶名和密碼屬性(不在URL中),如下面的示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
username: trolley
password: strongpassword
如果您不使用HTTPS和用戶憑證,那麼當您將密鑰存儲在默認目錄(~/. SSH)中並且URI指向SSH位置(如[email protected]:configuration/cloud-configuration)時,SSH也應該開箱即用。Git服務器的條目必須出現在~/中,這一點很重要。ssh/known_hosts文件,並且它是ssh-rsa格式的。不支持其他格式(如ecdsa-sha -nistp256)。爲了避免意外,您應該確保Git服務器的known_hosts文件中只有一個條目,並且它與您提供給配置服務器的URL匹配。
如果你不知道你的~/.git
在哪裏,使用git config --global
來操作設置(列如:git config --global http.sslVerify false
)
JGit需要PEM格式的RSA密鑰。下面是一個示例ssh-keygen(來自openssh)命令,它將生成一個corect格式的密鑰:
ssh-keygen -m PEM -t rsa -b 4096 -f ~/config_server_deploy_key.rsa
警告:在使用SSH密鑰時,預期的SSH私有密鑰必須以-----BEGIN RSA PRIVATE KEY-----
開始,如果密鑰以-----BEGIN OPENSSH PRIVATE KEY-----
開頭,那麼當spring-cloud-config服務器啓動時,RSA密鑰將不會加載。會出現類似如下的錯誤:
- Error in object 'spring.cloud.config.server.git': codes [PrivateKeyIsValid.spring.cloud.config.server.git,PrivateKeyIsValid]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [spring.cloud.config.server.git.,]; arguments []; default message []]; default message [Property 'spring.cloud.config.server.git.privateKey' is not a valid private key]
要糾正上述錯誤,必須將RSA密鑰轉換爲PEM格式。上面提供了一個使用openssh的示例,用於以適當的格式生成新密鑰。
Authentication with AWS CodeCommit
Spring Cloud Config Server還支持AWS CodeCommit身份驗證。AWS CodeCommit在從命令行使用Git時使用身份驗證助手。JGit庫沒有使用這個助手,所以如果Git URI與AWS CodeCommit模式匹配,就會創建AWS CodeCommit的JGit CredentialProvider。AWS CodeCommit uri遵循以下模式://git-codecommit.${AWS_REGION}.amazonaws.com/${repopath}。
如果您使用AWS CodeCommit URI提供用戶名和密碼,則它們必須是提供對存儲庫訪問的AWS accessKeyId和secretAccessKey。如果不指定用戶名和密碼,則使用AWS缺省憑據提供程序鏈檢索accessKeyId和secretAccessKey。如果您的Git URI匹配CodeCommit URI模式(如前面所示),則必須在用戶名和密碼中或在缺省憑據提供者鏈支持的位置之一中提供有效的AWS憑據。AWS EC2實例可以爲EC2實例使用IAM角色。
Authentication with Google Cloud Source
Spring Cloud Config Server還支持針對谷歌雲源存儲庫進行身份驗證。如果您的Git URI使用http或https協議,並且域名爲source.developers.google.com
,則將使用谷歌雲源憑據提供程序。一個谷歌雲存儲庫URI的格式是source.developers.google.com/p/${GCP_PROJECT}/r/${REPO}
。要獲取存儲庫的URI,請單擊谷歌雲源UI中的“Clone”,然後選擇“Manually generated credentials”。不生成任何憑據,只需複製顯示的URI。
谷歌雲源憑據提供者將使用谷歌雲平臺應用程序缺省憑據。有關如何爲系統創建應用程序默認憑據,請參閱谷歌雲SDK文檔。這種方法將適用於開發環境中的用戶帳戶和生產環境中的服務帳戶。
!!! com.google.auth:google-auth-library-oauth2-http
是一個可選的依賴項。如果google-auth-library-oauth2-http的jar包不在你的classpath中,無論git服務器的URI是什麼,都不會創建谷歌雲源憑據提供者。
Git SSH configuration using properties
默認情況下,當使用SSH URI連接到Git存儲庫時,Spring Cloud Config Server使用的JGit庫使用SSH配置文件,如~/.ssh/known_hosts
和/etc/ssh/ssh_config
。在雲環境(如cloud Foundry)中,本地文件系統可能是短暫的,或者不容易訪問。對於這些情況,可以使用Java屬性設置SSH配置。爲了激活基於屬性的SSH配置,必須將spring.cloud.config.server.git.ignoreLocalSshSettings屬性設置爲true,如下面的示例所示:
spring:
cloud:
config:
server:
git:
uri: [email protected]:team/repo1.git
ignoreLocalSshSettings: true
hostKey: someHostKey
hostKeyAlgorithm: ssh-rsa
privateKey: |
-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX
IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM+o7ds7FRES5RTjv2RT/JVNJCoqF
ol8+ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq+ObBBNhg5N+hOwKjjpzdj2Ud
1l7R+wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i
oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W
DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd
fY6yTiKxFzwb38IQP0ojIUWNrq0+9Xt+NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b
BO56/RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD+valhfD75MxoXU7s3FK7yjxy3rsG
EmfA6tHV8/4a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj
5MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8
+AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ/28I4BX/mOSe
pZVnfRixAoGBAO6Uiwt40/PKs53mCEWngslSCsh9oGAaLTf/XdvMns5VmuyyAyKG
ti8Ol5wqBMi4GIUzjbgUvSUt+IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ
xrtWZ9eNj2TsIAMp/svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx/AoGBANYW
dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi
PhKpeaeIiAaNnFo8m9aoTKr+7I6/uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX
VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z
FwlJc/xlFqDusrcHL7abW5qq0L4v3R+FrJw3ZYufzLTVcKfdj6GelwJJO+8wBm+R
gTKYJItEhT48duLIfTDyIpHGVm9+I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4
VAykcNgyDvtAVODP+4m6JvhjAoGBALbtTqErKN47V0+JJpapLnF0KxGrqeGIjIRV
cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee
KTbTjefRFhVUjQqnucAvfGi29f+9oE3Ei9f7wA+H35ocF6JvTYUsHNMIO/3gZ38N
CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC/BIBs
q0TY3we+ERB40U8Z2BvU61QuwaunJ2+uGadHo58VSVdggqAo0BSkH58innKKt96J
69pcVH/4rmLbXdcmNYGm6iu+MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT
-----END RSA PRIVATE KEY-----
下表描述了SSH配置屬性:
Property Name | Remarks |
---|---|
ignoreLocalSshSettings | If true, use property-based instead of file-based SSH config. Must be set at as spring.cloud.config.server.git.ignoreLocalSshSettings, not inside a repository definition. |
privateKey | Valid SSH private key. Must be set if ignoreLocalSshSettings is true and Git URI is SSH format. |
hostKey | Valid SSH host key. Must be set if hostKeyAlgorithm is also set. |
hostKeyAlgorithm | One of ssh-dss, ssh-rsa, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, or ecdsa-sha2-nistp521. Must be set if hostKey is also set. |
strictHostKeyChecking | true or false. If false, ignore errors with host key. |
knownHostsFile | Location of custom .known_hosts file. |
preferredAuthentications | Override server authentication method order. This should allow for evading login prompts if server has keyboard-interactive authentication before the publickey method. |
Placeholders in Git Search Paths
Spring Cloud Config Server還支持爲{application}和{profile}(如果需要還可以爲{label})提供佔位符的搜索路徑,如下例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
searchPaths: '{application}'
前面的清單將在存儲庫中搜索與目錄(以及頂層)同名的文件。通配符在具有佔位符的搜索路徑中也是有效的(搜索中包含任何匹配的目錄)。
Force pull in Git Repositories
如前所述,Spring Cloud Config Server複製了遠程git存儲庫,以防本地副本髒了(例如,操作系統進程更改了文件夾內容),從而導致Spring Cloud Config Server無法從遠程存儲庫更新本地副本。
爲了解決這個問題,有一個force-pull屬性,如果本地副本是髒的,它會使Spring Cloud Config Server強制從遠程存儲庫中拉出,如下面的示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
force-pull: true
如果您有一個多存儲庫配置,您可以配置每個存儲庫的force-pull屬性,如下面的示例所示:
spring:
cloud:
config:
server:
git:
uri: https://git/common/config-repo.git
force-pull: true
repos:
team-a:
pattern: team-a-*
uri: https://git/team-a/config-repo.git
force-pull: true
team-b:
pattern: team-b-*
uri: https://git/team-b/config-repo.git
force-pull: true
team-c:
pattern: team-c-*
uri: https://git/team-a/config-repo.git
!!! force-pull屬性的默認值爲false。
Deleting untracked branches in Git Repositories
由於Spring Cloud Config Server在將分支簽出到本地repo(例如通過標籤獲取屬性)後複製了一個遠程git存儲庫,所以它將永遠保留這個分支,或者直到下一次服務器重啓(這將創建新的本地repo)。因此,當遠程分支被刪除,但它的本地副本仍然可以獲取時,可能會出現這種情況。如果Spring Cloud Config Server客戶端服務以--spring.cloud.config.label=deletedRemoteBranch
開頭,它將從deletedRemoteBranch本地分支獲取屬性,而不是從master。
爲了讓本地倉庫保存乾淨和遠程倉庫同步,可以設置deleteUntrackedBranches參數,它將使Spring Cloud Config Server強制從本地存儲庫中刪除未跟蹤的分支。例如:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
deleteUntrackedBranches: true #默認false
Git Refresh Rate
通過使用spring.cloud.config.server.git.refreshRate
可以控制配置服務器從Git後端獲取更新配置數據的頻率。此屬性的值以秒爲單位指定。默認值爲0,這意味着每次請求配置服務器時,配置服務器都會從Git repo獲取更新後的配置。
Version Control Backend Filesystem Use
!!! 使用基於vcs的後端(git、svn),文件被檢出或克隆到本地文件系統。默認情況下,它們被放在系統臨時目錄中,前綴爲config-repo-
。例如,在linux上,它可以是/tmp/config-repo-<randomid>。
一些操作系統經常清理臨時目錄。這可能會導致意外的行爲,比如丟失屬性。爲了避免這個問題,可以通過將spring.cloud.config.server.git.basedir
或spring.cloud.config.server.svn.basedir
設置爲不駐留在系統臨時結構中的目錄來更改Config Server使用的目錄。
File System Backend
配置服務器中還有一個“本地”配置文件,它不使用Git,而是從本地類路徑或文件系統中加載配置文件(任何您想用spring.cloud.config.server.native.searchLocations
指向的靜態URL)。要使用本機配置文件,請使用spring.profile .active=native
啓動配置服務器。
searchLocations的默認值與本地Spring啓動應用程序相同(即:[classpath:/, classpath:/config, file:./, file:./config])。這並不會將來自服務器的application.properties
公開給所有客戶端,因爲在發送到客戶端之前,服務器中存在的任何屬性源都會被刪除。
文件系統後端對於快速啓動和測試非常有用。要在生產環境中使用它,您需要確保配置服務器的所有實例之間的文件系統是可靠的和共享的。
搜索位置可以包含{application}、{profile}和{label}的佔位符。通過這種方式,您可以隔離路徑中的目錄並選擇對您有意義的策略(例如每個應用程序的子目錄或每個概要文件的子目錄)。
如果在搜索位置不使用佔位符,這個存儲庫還將HTTP資源的A參數附加到搜索路徑的一個後綴上,這樣就可以從每個搜索位置和與標籤名稱相同的子目錄加載屬性文件(標記的屬性在Spring環境中優先)。因此,沒有佔位符的默認行爲與添加以/{label}/
結尾的搜索位置相同。例如,file:/tmp/config
與file:/tmp/config
、file:/tmp/config/{label}
相同。可以通過設置spring.cloud.config.server.native.addLabelLocations=false
來禁用此行爲。
Vault Backend
Spring Cloud配置服務器也支持Vault作爲後端。
Vault是一個安全訪問祕密的工具。祕密是您希望嚴格控制訪問的任何東西,比如API密鑰、密碼、證書和其他敏感信息。Vault爲任何祕密提供了一個統一的接口,同時提供了嚴格的訪問控制和記錄詳細的審計日誌。
更多信息請查看:Vault quick start guide.
要使配置服務器能夠使用Vault後端,可以使用Vault配置文件運行配置服務器。例如,在配置服務器的application.properties
中,可以添加spring.profiles.active=vault
。
默認情況下,配置服務器假設您的Vault服務器運行在127.0.0.1:8200。它還假設後端名稱爲secret,密鑰爲application。所有這些默認值都可以在配置服務器的application.properties
中配置。下表描述了可配置的Vault 屬性:
Name | Default Value |
---|---|
host | 127.0.0.1 |
port | 8200 |
scheme | http |
backend | secret |
defaultKey | application |
profileSeparator | , |
kvVersion | 1 |
skipSslValidation | false |
timeout | 5 |
namespace | null |
上表中的所有屬性必須以spring.cloud.config.server.vault
爲前綴,或放在組合配置的正確保險庫部分。
所有可配置的屬性都可以在org.springframework.cloud.config.server.environment.VaultEnvironmentProperties
中找到。
Vault 0.10.0引入了一個版本化的鍵值後端(k/v後端版本2),它公開了一個與早期版本不同的API,現在它需要一個數據/在掛載路徑和實際上下文路徑之間,並在數據對象中封裝祕密。設置spring.cloud.config.server.vault.kv-version=2
將考慮這一點。
另外,還有對Vault企業X-Vault-Namespace
標頭的支持。將其發送到Vault設置namespace
屬性。
配置服務器運行後,可以向服務器發出HTTP請求,從Vault後端檢索值。爲此,您需要一個Vault服務器的令牌。
首先,在你的保險庫裏放一些數據,如下面的例子所示:
$ vault kv put secret/application foo=bar baz=bam
$ vault kv put secret/myapp foo=myappsbar
其次,向配置服務器發出HTTP請求來檢索這些值,如下面的示例所示:
$ curl -X "GET" "http://localhost:8888/myapp/default" -H "X-Config-Token: yourtoken"
你應該看到一個類似以下的響應:
{
"name":"myapp",
"profiles":[
"default"
],
"label":null,
"version":null,
"state":null,
"propertySources":[
{
"name":"vault:myapp",
"source":{
"foo":"myappsbar"
}
},
{
"name":"vault:application",
"source":{
"baz":"bam",
"foo":"bar"
}
}
]
}
客戶端提供必要身份驗證以便配置服務器與Vault對話的默認方法是設置X-Config-Token報頭。但是,您可以通過設置與Spring Cloud Vault相同的配置屬性來替代省略header並在服務器中配置身份驗證。要設置的屬性是spring.cloud.config.server.vault.authentication
。應該將其設置爲受支持的身份驗證方法之一。您可能還需要設置其他特定於您使用的身份驗證方法的屬性,方法是使用與spring.cloud.vault
文檔相同的屬性名稱,而不是使用spring.cloud.config.server.vault
前綴。更多請查看 Spring Cloud Vault Reference Guide。
如果您省略了X-Config-Token頭並使用服務器屬性來設置身份驗證,則配置服務器應用程序需要對Spring Vault的附加依賴項來啓用附加的身份驗證選項。查看Spring Vault Reference Guide瞭解如何添加依賴。
Multiple Properties Sources
使用Vault時,可以爲應用程序提供多個屬性源。例如,假設您已經將數據寫入了Vault中的以下路徑:
secret/myApp,dev
secret/myApp
secret/application,dev
secret/application
寫入secret/application的屬性對於使用配置服務器的所有應用程序都是可用的。一個名爲myApp的應用程序,將任何屬性寫入secret/myApp和secret/application。當myApp啓用了dev配置文件時,上面所有路徑的屬性對它都是可用的,列表中第一個路徑中的屬性優先於其他路徑。