第二部分 Spring Cloud Config
1.0.0.BUILD-快照
Spring Cloud Config爲分佈式系統中的外部化配置提供服務器端和客戶端支持。使用Config Server,您可以有一個配置中心來跨所有的環境管理應用程序的外部屬性。客戶端和服務器上的概念等同於Spring Environment
和PropertySource
抽象,因此它們非常適合Spring應用程序,但可以與任何語言運行的任何應用程序一起使用。當應用程序通過部署管道從開發到測試再到生產環境時,您可以管理這些環境之間的配置,並確保應用程序遷移時具有運行所需要的所有內容。服務器存儲後端的默認實現使用git,因此它可以輕鬆支持配置環境的標籤版本,以及可用於管理內容的各種工具。添加替代實現並把它們插入Spring配置也很容易。
4.快速入門
這個快速入門使用Spring Cloud Config Server的服務器和客戶端。
首先,啓動服務器,如下所示:
$ cd spring-cloud-config-server
$ ../mvnw spring-boot:run
服務器是一個Spring Boot應用程序,因此如果您願意,可以從IDE運行它(主類是ConfigServerApplication
)。
接下來嘗試一個客戶端,如下所示:
$ curl localhost:8888/foo/development
{"name":"foo","label":"master","propertySources":[
{"name":"https://github.com/scratches/config-repo/foo-development.properties","source":{"bar":"spam"}},
{"name":"https://github.com/scratches/config-repo/foo.properties","source":{"foo":"bar"}}
]}
定位屬性源的默認策略是克隆git存儲庫(在spring.cloud.config.server.git.uri
)並使用它來初始化一個迷你 SpringApplication
。迷你應用程序的Environment
用於枚舉屬性源並在JSON端點發布它們。
HTTP服務具有以下形式的資源:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中application
作爲spring.config.name被
注入SpringApplication
(在正常的Spring Boot應用程序中通常什麼是application),profile
是一個active profile(或逗號分隔的屬性列表),並且label
是一個可選的git標籤(默認爲master
)。
Spring Cloud Config Server從各種來源爲遠程客戶端提取配置。以下示例從git存儲庫(必須提供)獲取配置,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
其他來源是任何JDBC兼容的數據庫,Subversion,Hashicorp Vault,Credhub和本地文件系統。
4.1客戶端使用方法
要在應用程序中使用這些功能,您可以將其構建爲依賴於spring-cloud-config-client的Spring Boot應用程序(例如,請參閱config-client或示例應用程序的測試用例)。添加依賴項最方便的方法是使用Spring Boot啓動程序org.springframework.cloud:spring-cloud-starter-config
。也有一個父pom和spring-cloud-starter-parent
BOM給Maven用戶,以及Gradle和Spring CLI用戶使用的Spring IO版本管理屬性文件。以下示例顯示了典型的Maven配置:
pom.xml中。
<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 Boot應用程序,例如以下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改變config server的位置
(類似於application.properties
但是用於應用程序上下文的引導階段),如以下示例所示:
spring.cloud.config.uri: http://myconfigserver.com
默認情況下,如果未設置應用程序名稱,將使用application
。要修改名稱,可以將以下屬性添加到bootstrap.properties
文件中:
spring.application.name: myapp
設置屬性時, |
引導屬性在/env
端點中顯示爲高優先級屬性源,如以下示例所示。
$ curl localhost:8080/env
{
"profiles":[],
"configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"},
"servletContextInitParams":{},
"systemProperties":{...},
...
}
名爲configService:<URL of remote repository>/<file name>的屬性源
包含foo
值爲bar
且優先級最高的屬性。
屬性源名稱中的URL是git存儲庫,而不是配置服務器URL。 |
5. 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
啓動它(configserver.yml
在Config Server jar中)。另一種是使用您自己的application.properties
,如以下示例所示:
application.properties。
server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo
這裏${user.home}/config-repo
是包含YAML和屬性文件的git存儲庫。
在Windows上,如果文件URL是帶有驅動器前綴的絕對值,則需要額外的“/”(例如 |
以下清單顯示了在前面的示例中創建git存儲庫的方法。
|
使用git存儲庫的本地文件系統僅用於測試。您應該使用服務器在生產中託管配置存儲庫。 |
如果只保留文本文件,則配置存儲庫的初始克隆可以快速有效。如果存儲二進制文件(尤其是大型文件),則第一次配置請求或服務器中遇到內存不足錯誤時可能會出現延遲。 |
5.1環境存儲庫
您應該在哪裏存儲配置服務器的配置數據?管理此行爲的策略是EnvironmentRepository,它
服務於Environment
對象。這Environment
是來自Spring Environment
的域的淺Copy(包括propertySources
作爲主要特徵)。該Environment
資源由三個參數:
{application}
,映射到客戶端的spring.application.name
。{profile}
,映射到客戶端的spring.profiles.active
(以逗號分隔的列表)。{label}
,這是標記配置文件版本集的服務器端特性。
存儲庫實現通常表現得像Spring Boot應用程序,從spring.config.name
加載配置文件等於{application}
參數,並且spring.profiles.active
等於{profiles}
參數。配置文件的優先規則也與常規Spring Boot應用程序相同:Active配置文件優先於默認配置文件,如果有多個配置文件,則最後一個配置文件獲勝(類似於向Map中添加條目)。
以下示例客戶端應用程序具有此引導程序配置:
bootstrap.yml。
spring:
application:
name: foo
profiles:
active: dev,mysql
(像往常一樣,Spring Boot應用程序也可以通過環境變量或命令行參數設置這些屬性)。
如果存儲庫是基於文件的,則服務器會從application.yml
(在所有客戶端之間共享)和 foo.yml
(foo.yml
優先級更高)創建一個 Environment
。如果YAML文件中包含指向Spring配置文件的文檔,則它們有更高的優先級(按列出的配置文件的順序)。如果存在特定於配置文件的YAML(或屬性)文件,則這些文件的優先級也高於默認值。更高的優先級轉換爲前面提到的Environment的
PropertySource
。(這些相同的規則適用於獨立的Spring Boot應用程序。)
您可以將spring.cloud.config.server.accept-empty設置爲false,以便在找不到應用程序時,Server將返回HTTP 404狀態。默認情況下,此標誌設置爲true。
5.1.1 Git後端
默認實現EnvironmentRepository
使用Git後端,這對於管理升級和物理環境以及審計更改非常方便。要更改存儲庫的位置,可以spring.cloud.config.server.git.uri
在Config Server中設置配置屬性(例如,在中application.yml
)。如果你用它設置它file:
前綴,它應該在本地存儲庫中工作,這樣您就可以在沒有服務器的情況下快速輕鬆地開始使用。但是,在這種情況下,服務器直接在本地存儲庫上運行而不對其進行克隆(如果它不是裸的則無關緊要,因爲Config Server從不對“遠程”存儲庫進行更改)。要向上擴展Config Server並使其具有高可用性,您需要讓服務器的所有實例指向同一個存儲庫,因此只有共享文件系統才能工作。即使在這種情況下,最好將ssh:
協議用於共享文件系統存儲庫,以便服務器可以克隆它並使用本地工作副本作爲緩存。
此存儲庫實現將{label}
HTTP資源的參數映射到git標籤(提交標識,分支名稱或標記)。如果git分支或標記名稱包含斜槓(/
),則應使用特殊字符串指定HTTP URL中的標籤(_)
(以避免與其他URL路徑不一致)。例如,如果標籤是foo/bar
,則替換斜槓將導致以下標籤:foo(_)bar
。包含特殊字符串(_)
也可以應用於{application}
參數。如果您使用命令行客戶端(如curl),請小心URL中的括號 - 您應該使用單引號('')將它們從shell中轉義。
跳過SSL證書驗證
通過將git.skipSslValidation
屬性設置爲true
(默認值爲false
),可以禁用配置服務器對Git服務器的SSL證書的驗證。
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https:
<span style="color:#7f007f"> //example.com/my/repo skipSslValidation</span>:<span style="color:#7f0055"><strong>true</strong></span></span></span>
設置HTTP連接超時
您可以配置配置服務器等待獲取HTTP連接的時間(以秒爲單位)。使用該git.timeout
屬性。
<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"> server</span>:
<span style="color:#7f007f"> git</span>:<span style="color:#7f007f"> uri</span>:https
:
<span style="color:#7f007f">//example.com/my/repo </span><span style="color:#7f007f"> timeout</span>:4</span></span>
佔位符在Git URI中
Spring Cloud Config Server支持帶有佔位符的git存儲庫URL {application}
和{profile}
({label}
如果需要,請記住該標籤仍然作爲git標籤應用)。因此,您可以使用類似於以下的結構來支持“ 每個應用程序一個存儲庫 ”策略:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://github.com/myorg/ <span style="color:#7f0055"><strong>{ </strong></span><span style="color:#7f007f">application </span><span style="color:#7f0055"><strong>}</strong></span></span></span>
您還可以使用類似的模式支持“ 每個配置文件一個存儲庫 ”策略 {profile}
。
此外,在{application}
參數中使用特殊字符串“(_)” 可以啓用對多個組織的支持,如以下示例所示:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://github.com/ <span style="color:#7f0055"><strong>{ </strong></span><span style="color:#7f007f">application </span><span style="color:#7f0055"><strong>}</strong></span></span></span>
其中{application}
被設置在請求時在以下格式:organization(_)application
。
模式匹配和多個存儲庫
Spring Cloud Config還支持更復雜的需求,並在應用程序和配置文件名稱上進行模式匹配。模式格式是{application}/{profile}
帶有通配符的逗號分隔的名稱列表(請注意,可能需要引用以通配符開頭的模式),如以下示例所示:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://github.com/spring-cloud-samples/config-repo
<span style="color:#7f007f"> repos</span>:
<span style="color:#7f007f"> simple</span>:https://github.com/simple/config-repo
<span style="color:#7f007f"> special</span>:
<span style="color:#7f007f"> pattern</span>: special * / dev *,* special * / dev *
<span style="color:#7f007f"> uri</span>:https://github.com/special/config-repo
<span style="color:#7f007f"> local</span>:
<span style="color:#7f007f"> pattern</span>:local *
<span style="color:#7f007f"> uri</span>:file:/ home / configsvc / config-repo</span></span>
如果{application}/{profile}
與任何模式都不匹配,則使用下面定義的默認URI spring.cloud.config.server.git.uri
。在上面的示例中,對於“ 簡單 ”存儲庫,模式是simple/*
(它只匹配simple
在所有配置文件中命名的一個應用程序)。在“ 本地 ”庫匹配所有應用程序名稱開頭local
的所有配置文件(該/*
後綴會自動添加到沒有檔案資料匹配的任何模式)。
的“ 單行 ”中所使用的短切“ 簡單 ”可以使用例如僅當要設置的唯一屬性是URI。如果您需要設置其他任何內容(憑據,模式等),則需要使用完整表單。 |
的pattern
在回購屬性實際上是一個數組,所以可以使用一個YAML陣列(或[0]
,[1]
等在屬性文件後綴)綁定到多個圖案。如果要運行具有多個配置文件的應用程序,則可能需要執行此操作,如以下示例所示:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://github.com/spring-cloud-samples/config-repo
<span style="color:#7f007f"> repos</span>:
<span style="color:#7f007f"> development</span>:
<span style="color:#7f007f"> pattern</span>:
- <span style="color:#2a00ff">'* / development'</span>
- <span style="color:#2a00ff">'* / </span>
<span style="color:#7f007f"> staging'uri</span>:https://github.com/development/config-repo
<span style="color:#7f007f"> staging</span>:
<span style="color:#7f007f"> pattern</span>:
- <span style="color:#2a00ff">'* / QA'</span>
- <span style="color:#2a00ff">'* /生產' </span>
<span style="color:#7f007f"> URI</span>:https://github.com/staging/config-repo</span></span>
Spring Cloud猜測包含未結束的配置文件的模式 |
每個存儲庫還可以選擇將配置文件存儲在子目錄中,並且可以將搜索這些目錄的模式指定爲searchPaths
。以下示例顯示了頂級的配置文件:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://github.com/spring-cloud-samples/config-repo
<span style="color:#7f007f"> searchPaths</span>:foo,bar *</span></span>
在前面的示例中,服務器在頂級和foo/
子目錄以及名稱以其開頭的任何子目錄中搜索配置文件bar
。
默認情況下,服務器在首次請求配置時克隆遠程存儲庫。可以將服務器配置爲在啓動時克隆存儲庫,如以下頂級示例所示:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://git/common/config-repo.git <span style="color:#7f007f"> repos</span>:
<span style="color:#7f007f"> team</span> -a
:
<span style="color:#7f007f"> pattern</span>:team-a- *
<span style="color:#7f007f"> cloneOnStart</span>:<span style="color:#7f0055"><strong>true </strong></span>
<span style="color:#7f007f"> uri</span>:https:// git / team -a / config-repo.git
<span style="color:#7f007f"> team-b</span>:
<span style="color:#7f007f"> pattern</span>:team-b- *
<span style="color:#7f007f"> cloneOnStart</span>:<span style="color:#7f0055"><strong>false </strong></span>
<span style="color:#7f007f"> uri</span>:https://git/team-b/config-repo.git
<span style="color:#7f007f"> team-c</span>:
<span style="color:#7f007f"> pattern</span>:team-c- *
<span style="color:#7f007f"> uri</span>:https://git/team-a/config-repo.git</span></span>
在前面的示例中,服務器在接受任何請求之前在啓動時克隆team-a的config-repo。在請求來自存儲庫的配置之前,不會克隆所有其他存儲庫。
在Config Server啓動時設置要克隆的存儲庫有助於在Config Server啓動時快速識別配置錯誤的配置源(例如無效的存儲庫URI)。如果 |
認證
要在遠程存儲庫上使用HTTP基本身份驗證,請單獨添加username
和password
屬性(不在URL中),如以下示例所示:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://github.com/spring-cloud-samples/config-repo
<span style="color:#7f007f"> 用戶名</span>:trolley
<span style="color:#7f007f"> 密碼</span>:strongpassword</span></span>
如果您不使用HTTPS和用戶憑據,當您將密鑰存儲在默認目錄(~/.ssh
)中並且URI指向SSH位置(例如,)時,SSH也應該開箱即用[email protected]:configuration/cloud-configuration
。重要的是Git服務器的條目存在於~/.ssh/known_hosts
文件中並且ssh-rsa
格式正確。ecdsa-sha2-nistp256
不支持其他格式(例如)。爲了避免意外,您應該確保known_hosts
Git服務器的文件中只有一個條目,並且它與您提供給配置服務器的URL相匹配。如果在URL中使用主機名,則希望文件中具有該主機名(而不是IP)known_hosts
。可以使用JGit訪問存儲庫,因此您在其上找到的任何文檔都應該適用。可以設置HTTPS代理設置~/.git/config
或者(與任何其他JVM進程相同)具有系統屬性(-Dhttps.proxyHost
和-Dhttps.proxyPort
)。
如果您不知道 |
使用AWS CodeCommit進行身份驗證
Spring Cloud Config Server還支持AWS CodeCommit身份驗證。從命令行使用Git時,AWS CodeCommit使用身份驗證幫助程序。此助手不與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實例可以將IAM角色用於EC2實例。
該 |
使用屬性進行Git SSH配置
默認情況下,春季雲配置服務器使用JGit庫使用SSH配置文件,如~/.ssh/known_hosts
和/etc/ssh/ssh_config
通過使用SSH URI連接到Git倉庫時。在Cloud Foundry等雲環境中,本地文件系統可能是短暫的或不易訪問的。對於這些情況,可以使用Java屬性設置SSH配置。要激活基於屬性的SSH配置,spring.cloud.config.server.git.ignoreLocalSshSettings
必須將該屬性設置爲true
,如以下示例所示:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:git <em><span style="color:gray">@ gitserver.com:team / repo1.git</span></em>
<span style="color:#7f007f"> ignoreLocalSshSettings</span>:<span style="color:#7f0055"><strong>true </strong></span>
<span style="color:#7f007f"> hostKey</span>:someHostKey
<span style="color:#7f007f"> hostKeyAlgorithm</span>:ssh-rsa
<span style="color:#7f007f"> privateKey</span>:|
-----開始RSA私鑰-----
MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX
IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM + o7ds7FRES5RTjv2RT / JVNJCoqF
OL8 + ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq + ObBBNhg5N + hOwKjjpzdj2Ud
1l 7R + wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i
oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W
DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd
fY6yTiKxFzwb38IQP0ojIUWNrq0 + 9 Xt + NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b
BO56 / RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD + valhfD75MxoXU7s3FK7yjxy3rsG
EmfA6tHV8 / 4 a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj
5 MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8
+ AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ / 28 I4BX / mOSe
pZVnfRixAoGBAO6Uiwt40 / PKs53mCEWngslSCsh9oGAaLTf / XdvMns5VmuyyAyKG
ti8Ol5wqBMi4GIUzjbgUvSUt + IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ
xrtWZ9eNj2TsIAMp / svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx / AoGBANYW
dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi
PhKpeaeIiAaNnFo8m9aoTKr + 7 I6 / uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX
VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z
FwlJc / xlFqDusrcHL7abW5qq0L4v3R + FrJw3ZYufzLTVcKfdj6GelwJJO + 8 wBm + R
gTKYJItEhT48duLIfTDyIpHGVm9 + I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4
VAykcNgyDvtAVODP + 4 m6JvhjAoGBALbtTqErKN47V0 + JJpapLnF0KxGrqeGIjIRV
cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee
KTbTjefRFhVUjQqnucAvfGi29f + 9 oE3Ei9f7wA + H35ocF6JvTYUsHNMIO / 3 gZ38N
CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC /圍兜
q0TY3we + ERB40U8Z2BvU61QuwaunJ2 + uGadHo58VSVdggqAo0BSkH58innKKt96J
69 pcVH / 4 rmLbXdcmNYGm6iu + MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT
----- END RSA私鑰-----</span></span>
下表介紹了SSH配置屬性。
表5.1。SSH配置屬性
Property名稱 | 備註 |
---|---|
ignoreLocalSshSettings |
如果 |
專用密鑰 |
有效的SSH私鑰。如果 |
hostKey |
有效的SSH主機密鑰。如果 |
hostKeyAlgorithm |
其中一個 |
strictHostKeyChecking |
|
knownHostsFile |
自定義 |
preferredAuthentications |
覆蓋服務器身份驗證方法順序。如果服務器在 |
佔位符在Git搜索路徑中
Spring Cloud Config Server還支持帶{application}
和{profile}
({label}
如果需要)佔位符的搜索路徑,如以下示例所示:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://github.com/spring-cloud-samples/config-repo
<span style="color:#7f007f"> searchPaths</span>:<span style="color:#2a00ff">'{application}'</span></span></span>
上面的清單導致在存儲庫中搜索與目錄(以及頂層)同名的文件。通配符在帶佔位符的搜索路徑中也有效(搜索中包含任何匹配的目錄)。
強行拉入Git存儲庫
如前所述,Spring Cloud Config Server會在本地副本變髒(例如,OS進程更改文件夾內容)時複製遠程git存儲庫,以使Spring Cloud Config Server無法從遠程存儲庫更新本地副本。
要解決此問題,force-pull
如果本地副本是髒的,則有一個屬性可以從遠程存儲庫強制提取Spring Cloud Config Server,如以下示例所示:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://github.com/spring-cloud-samples/config-repo
<span style="color:#7f007f"> force-pull</span>:<span style="color:#7f0055"><strong>true</strong></span></span></span>
如果您具有多存儲庫配置,則可force-pull
以爲每個存儲庫配置該屬性,如以下示例所示:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://git/common/config-repo.git <span style="color:#7f007f"> force-pull</span>:<span style="color:#7f0055"><strong>true </strong></span>
<span style="color:#7f007f"> repos</span>:
<span style="color:#7f007f"> team</span> -a
:
<span style="color:#7f007f"> pattern</span>:team-a- *
<span style="color:#7f007f"> uri</span>:https:// git /team-a/config-repo.git
<span style="color:#7f007f"> force-pull</span>:<span style="color:#7f0055"><strong>true </strong></span>
<span style="color:#7f007f"> team-b</span>:
<span style="color:#7f007f"> pattern</span>:team-b- *
<span style="color:#7f007f"> uri</span>:https://git/team-b/config-repo.git
<span style="color:#7f007f"> force-pull</span>:<span style="color:#7f0055"><strong>true </strong></span>
<span style="color:#7f007f"> team-c</span>:
<span style="color:#7f007f"> pattern</span>:team-c- *
<span style="color:#7f007f"> uri</span>:https://git/team-a/config-repo.git</span></span>
|
刪除Git存儲庫中未跟蹤的分支
由於Spring Cloud Config Server在簽出分支到本地存儲庫後具有遠程git存儲庫的克隆(例如,通過標籤獲取屬性),它將永久保留此分支或直到下一個服務器重新啓動(這將創建新的本地存儲庫)。因此可能存在刪除遠程分支但仍然可以獲取其本地副本的情況。如果Spring Cloud Config Server客戶端服務啓動,--spring.cloud.config.label=deletedRemoteBranch,master
它將從deletedRemoteBranch
本地分支獲取屬性,但不從master
。
爲了保持本地存儲庫分支的清潔和遠程 - deleteUntrackedBranches
可以設置屬性。它將使Spring Cloud Config Server 強制從本地存儲庫中刪除未跟蹤的分支。例:
<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"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://github.com/spring-cloud-samples/config-repo
<span style="color:#7f007f"> deleteUntrackedBranches</span>:<span style="color:#7f0055"><strong>true</strong></span></span></span>
|
Git刷新率
您可以使用控制來控制配置服務器從Git後端獲取更新配置數據的頻率spring.cloud.config.server.git.refreshRate
。此屬性的值以秒爲單位指定。默認情況下,該值爲0,這意味着配置服務器將在每次請求時從Git存儲庫獲取更新的配置。
5.1.2版本控制後端文件系統使用
使用基於VCS的後端(git,svn),文件將被簽出或克隆到本地文件系統。默認情況下,它們放在系統臨時目錄中,前綴爲 |
5.1.3文件系統後端
Config Server中還有一個“ 本機 ”配置文件,它不使用Git,但從本地類路徑或文件系統(您想要指向的任何靜態URL)加載配置文件spring.cloud.config.server.native.searchLocations
。要使用本機配置文件,請啓動配置服務器spring.profiles.active=native
。
請記住使用 |
它的默認值 |
文件系統後端非常適合快速入門和測試。要在生產中使用它,您需要確保文件系統可靠並在Config Server的所有實例之間共享。 |
搜索位置可以包含佔位符{application}
,{profile}
和{label}
。通過這種方式,您可以隔離路徑中的目錄並選擇對您有意義的策略(例如每個應用程序的子目錄或每個配置文件的子目錄)。
如果您不在搜索位置使用佔位符,則此存儲庫還會將{label}
HTTP資源的參數附加到搜索路徑上的後綴,因此將從每個搜索位置和與該標籤同名的子目錄中加載屬性文件(標記的屬性在Spring環境中優先。因此,沒有佔位符的默認行爲與添加以/{label}/
。結尾的搜索位置相同。例如,file:/tmp/config
與...相同file:/tmp/config,file:/tmp/config/{label}
。可以通過設置禁用此行爲spring.cloud.config.server.native.addLabelLocations=false
。
5.1.4 Vault後端
Spring Cloud Config Server還支持Vault作爲後端。
Vault是一種安全訪問機密的工具。祕密就是您要嚴格控制訪問的任何內容,例如API密鑰,密碼,證書和其他敏感信息。Vault爲任何機密提供統一的界面,同時提供嚴格的訪問控制並記錄詳細的審計日誌。
有關Vault的詳細信息,請參閱Vault快速入門指南。
要使配置服務器能夠使用Vault後端,您可以使用vault
配置文件運行配置服務器。例如,在配置服務器中application.properties
,您可以添加spring.profiles.active=vault
。
默認情況下,配置服務器假定您的Vault服務器運行於http://127.0.0.1:8200
。它還假設後端的名稱是secret
,密鑰是application
。所有這些默認值都可以在配置服務器中配置application.properties
。下表介紹了可配置的Vault屬性:
名稱 | 默認值 |
---|---|
host |
127.0.0.1 |
port |
8200 |
scheme |
HTTP |
backend |
secret |
defaultKey |
application |
profileSeparator |
, |
kvVersion |
1 |
skipSslValidation |
false |
timeout |
5 |
namespace |
null |
重要 | |
---|---|
上表中的所有屬性都必須以 |
所有可配置的屬性都可以在中找到org.springframework.cloud.config.server.environment.VaultEnvironmentProperties
。
Vault 0.10.0引入了一個版本化的鍵值後端(k / v後端版本2),它暴露了與早期版本不同的API,它現在需要data/
在掛載路徑和實際上下文路徑之間並在data
對象中包裝祕密。設置kvVersion=2
將考慮到這一點。
(可選)支持Vault Enterprise X-Vault-Namespace
標頭。要將其發送到Vault,請設置該namespace
屬性。
在配置服務器運行時,您可以向服務器發出HTTP請求以從Vault後端檢索值。爲此,您需要Vault服務器的令牌。
首先,在Vault中放置一些數據,如以下示例所示:
<span style="color:#333333"><span style="color:#000000">$ vault kv put secret / application foo = bar baz = bam
$ vault kv put secret / myapp foo = myappsbar</span></span>
其次,向配置服務器發出HTTP請求以檢索值,如以下示例所示:
$ curl -X "GET" "http://localhost:8888/myapp/default" -H "X-Config-Token: yourtoken"
您應該看到類似於以下內容的響應:
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f0055"><strong>{ </strong></span>
<span style="color:#2a00ff">“name”</span>:<span style="color:#2a00ff">“myapp” </span><span style="color:#7f0055"><strong>,</strong></span>
<span style="color:#2a00ff">“profiles”</span>:<span style="color:#7f0055"><strong>[ </strong></span>
<span style="color:#2a00ff">“default”</span>
] <span style="color:#7f0055"><strong>,</strong></span>
<span style="color:#2a00ff">“label”</span>:null <span style="color:#7f0055"><strong>,</strong></span>
<span style="color:#2a00ff">“version”</span>:null <span style="color:#7f0055"><strong>,</strong></span>
<span style="color:#2a00ff">“state”</span>:null <span style="color:#7f0055"><strong>,</strong></span>
<span style="color:#2a00ff">“propertySources”</span>:<span style="color:#7f0055"><strong>[ </strong></span>
<span style="color:#7f0055"><strong>{ </strong></span>
<span style="color:#2a00ff">“name”</span>:<span style="color:#2a00ff">“vault: myapp“ </span><span style="color:#7f0055"><strong>,</strong></span>
<span style="color:#2a00ff">”source“</span>:<span style="color:#7f0055"><strong>{ </strong></span>
<span style="color:#2a00ff">”foo“</span>:<span style="color:#2a00ff">”myappsbar“ </span>
<span style="color:#7f0055"><strong>} </strong></span>
<span style="color:#7f0055"><strong>},</strong></span>
<span style="color:#7f0055"><strong>{ </strong></span>
<span style="color:#2a00ff">”name“</span>:<span style="color:#2a00ff">”vault:application“ </span><span style="color:#7f0055"><strong>,</strong></span>
<span style="color:#2a00ff">”source“</span>:<span style="color:#7f0055"><strong>{ </strong></span>
<span style="color:#2a00ff">“baz”</span>:<span style="color:#2a00ff">“bam” </span><span style="color:#7f0055"><strong>,</strong></span>
<span style="color:#2a00ff">“foo”</span>:<span style="color:#2a00ff">“bar” </span>
<span style="color:#7f0055"><strong>} </strong></span>
<span style="color:#7f0055"><strong>} </strong></span>
<span style="color:#7f0055"><strong>] </strong></span>
<span style="color:#7f0055"><strong>}</strong></span></span></span>
多個屬性源
使用Vault時,您可以爲應用程序提供多個屬性源。例如,假設您已將數據寫入Vault中的以下路徑:
<span style="color:#333333"><span style="color:#000000">祕密/對myApp,開發
祕密/對myApp
祕密/應用開發
祕密/應用</span></span>
寫入的屬性secret/application
可供使用Config Server的所有應用程序使用。名稱爲的應用程序myApp
將具有寫入secret/myApp
並secret/application
可用的任何屬性。如果啓用myApp
了dev
配置文件,則可以使用寫入所有上述路徑的屬性,列表中第一個路徑中的屬性優先於其他路徑。
5.1.5通過代理訪問後端
配置服務器可以通過HTTP或HTTPS代理訪問Git或Vault後端。通過proxy.http
和下的設置可以控制Git或Vault的此行爲proxy.https
。這些設置是每個存儲庫,因此如果您使用的是複合環境存儲庫,則必須單獨爲複合中的每個後端配置代理設置。如果使用需要單獨的代理服務器用於HTTP和HTTPS URL的網絡,則可以爲單個後端配置HTTP和HTTPS代理設置。
下表描述了HTTP和HTTPS代理的代理配置屬性。所有這些屬性必須以proxy.http
或爲前綴proxy.https
。
表5.2。代理配置屬性
物業名稱 | 備註 |
---|---|
主辦 |
代理的主機。 |
港口 |
用於訪問代理的端口。 |
nonProxyHosts |
配置服務器應在代理外部訪問的任何主機。如果提供兩個值 |
用戶名 |
用於向代理進行身份驗證的用戶名。如果提供兩個值 |
密碼 |
用於向代理進行身份驗證的密碼。如果提供兩個值 |
以下配置使用HTTPS代理訪問Git存儲庫。
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> profiles</span>:
<span style="color:#7f007f"> active</span>:git
<span style="color:#7f007f"> cloud</span>:
<span style="color:#7f007f"> config</span>:
<span style="color:#7f007f"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:https://github.com/spring-cloud-samples/config-repo
<span style="color:#7f007f"> proxy</span>:
<span style="color:#7f007f"> https</span>:
<span style="color:#7f007f"> host</span>:my-proxy.host.io
<span style="color:#7f007f"> password</span>:myproxypassword
<span style="color:#7f007f"> port</span>:<span style="color:#2a00ff">'3128' </span>
<span style="color:#7f007f"> 用戶名</span>:myproxyusername
<span style="color:#7f007f"> nonProxyHosts</span>:example.com</span></span>
5.1.6與所有應用程序共享配置
所有應用程序之間的共享配置因您採用的方法而異,如以下主題中所述:
基於文件的存儲庫
基於文件(GIT,SVN和本地)倉庫,並在文件名的資源application*
(application.properties
,application.yml
,application-*.properties
,等)的所有客戶端應用程序之間共享。您可以使用具有這些文件名的資源來配置全局默認值,並根據需要由特定於應用程序的文件覆蓋它們。
#_property_overrides [property overrides]功能也可用於設置全局默認值,允許佔位符應用程序在本地覆蓋它們。
使用“ 本機 ”配置文件(本地文件系統後端),您應該使用不屬於服務器自身配置的顯式搜索位置。否則, |
Vault服務器
使用Vault作爲後端時,您可以通過放置配置來與所有應用程序共享配置secret/application
。例如,如果您運行下面的命令庫,使用配置服務器的所有應用程序將具有的屬性foo
,並baz
提供給他們:
<span style="color:#333333"><span style="color:#000000">$ vault寫祕密/應用程序foo = bar baz = bam</span></span>
5.1.7 JDBC後端
Spring Cloud Config Server支持JDBC(關係數據庫)作爲配置屬性的後端。您可以通過添加spring-jdbc
到類路徑並使用jdbc
配置文件或添加類型的bean 來啓用此功能JdbcEnvironmentRepository
。如果在類路徑中包含正確的依賴項(有關詳細信息,請參閱用戶指南),Spring Boot會配置數據源。
數據庫需要有一個叫做表PROPERTIES
一個名爲列APPLICATION
,PROFILE
以及LABEL
(與通常的Environment
意思),再加上KEY
和VALUE
在鍵和值對Properties
風格。所有字段都是Java中的String類型,因此您可以根據VARCHAR
需要設置它們。屬性值的行爲方式與它們來自命名的Spring Boot屬性文件{application}-{profile}.properties
(包括所有加密和解密)的行爲方式相同,後者將作爲後處理步驟(即不直接在存儲庫實現中)應用。
5.1.8 CredHub後端
Spring Cloud Config Server支持CredHub作爲配置屬性的後端。您可以通過向Spring CredHub添加依賴項來啓用此功能。
pom.xml中。
<span style="color:#333333"><span style="color:#000000"><span style="color:#3f7f7f"><dependencies> </span>
<span style="color:#3f7f7f"><dependency> </span>
<span style="color:#3f7f7f"><groupId></span> org.springframework.credhub <span style="color:#3f7f7f"></ groupId> </span>
<span style="color:#3f7f7f"><artifactId></span> spring-credhub-starter <span style="color:#3f7f7f"></ artifactId> </span>
<span style="color:#3f7f7f"></ dependency> </span>
<span style="color:#3f7f7f"></ dependencies></span></span></span>
以下配置使用相互TLS訪問CredHub:
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> profiles</span>:
<span style="color:#7f007f"> active</span>:credhub
<span style="color:#7f007f"> cloud</span>:
<span style="color:#7f007f"> config</span>:
<span style="color:#7f007f"> server</span>:
<span style="color:#7f007f"> credhub</span>:
<span style="color:#7f007f"> url</span>:https:// credhub:8844</span></span>
屬性應存儲爲JSON,例如:
<span style="color:#333333"><span style="color:#000000">credhub set --name“/ demo-app / default / master / toggles”--type = json
value:{“toggle.button”:“blue”,“toggle.link”:“red”}</span></span>
<span style="color:#333333"><span style="color:#000000">credhub set --name“/ demo-app / default / master / abs”--type = json
value:{“marketing.enabled”:true,“external.enabled”:false}</span></span>
具有該名稱的所有客戶端應用程序spring.cloud.config.name=demo-app
將具有以下可用屬性:
<span style="color:#333333"><span style="color:#000000">{
toggle.button:“blue”,
toggle.link:“red”,
marketing.enabled:是的,
external.enabled:false
}</span></span>
如果未指定配置文件, |
OAuth 2.0
您可以使用UAA作爲提供程序對OAuth 2.0進行身份驗證。
pom.xml中。
<span style="color:#333333"><span style="color:#000000"><span style="color:#3f7f7f"><dependencies> </span>
<span style="color:#3f7f7f"><dependency> </span>
<span style="color:#3f7f7f"><groupId></span> org.springframework.security <span style="color:#3f7f7f"></ groupId> </span>
<span style="color:#3f7f7f"><artifactId></span> spring-security-config <span style="color:#3f7f7f"></ artifactId> </span>
<span style="color:#3f7f7f"></ dependency> </span>
<span style="color:#3f7f7f"><dependency> </span>
<span style="color:#3f7f7f"><groupId></span> org.springframework.security <span style="color:#3f7f7f"></ groupId> </span>
<span style="color:#3f7f7f">< artifactId></span> spring-security-oauth2-client <span style="color:#3f7f7f"></ artifactId> </span>
<span style="color:#3f7f7f"></ dependency> </span>
<span style="color:#3f7f7f"></ dependencies></span></span></span>
以下配置使用OAuth 2.0和UAA訪問CredHub:
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> profiles</span>:
<span style="color:#7f007f"> active</span>:credhub
<span style="color:#7f007f"> cloud</span>:
<span style="color:#7f007f"> config</span>:
<span style="color:#7f007f"> server</span>:
<span style="color:#7f007f"> credhub</span>:
<span style="color:#7f007f"> url</span>:https:// credhub:8844
<span style="color:#7f007f"> oauth2</span>:
<span style="color:#7f007f"> registration-id</span>:credhub-client
<span style="color:#7f007f"> security</span>:
<span style="color:#7f007f"> oauth2</span>:
<span style="color:#7f007f"> client</span>:
<span style="color:#7f007f"> registration</span>:
<span style="color:#7f007f"> credhub-client</span>:
<span style="color:#7f007f"> provider</span>:uaa
<span style="color:#7f007f"> client- id</span>:credhub_config_server
<span style="color:#7f007f"> client-secret</span>:asecret
<span style="color:#7f007f"> authorization-grant-type</span>:client_credentials
<span style="color:#7f007f"> provider</span>:
<span style="color:#7f007f"> uaa</span>:
<span style="color:#7f007f"> token-uri</span>:https:// uaa:8443 / oauth / token</span></span>
使用的UAA client-id應具有 |
5.1.9複合環境存儲庫
在某些情況下,您可能希望從多個環境存儲庫中提取配置數據。爲此,您可以composite
在配置服務器的應用程序屬性或YAML文件中啓用配置文件。例如,如果要從Subversion存儲庫以及兩個Git存儲庫中提取配置數據,可以爲配置服務器設置以下屬性:
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
<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>:svn
<span style="color:#7f007f"> uri</span>:file:/// path / to / svn / repo
-
<span style="color:#7f007f"> type</span>:git
<span style="color:#7f007f"> uri</span>:file:/// path / to / rex / git / repo
-
<span style="color:#7f007f"> type</span>:git
<span style="color:#7f007f"> uri</span>:file:/// path / to / walter / git / repo</span></span>
使用此配置,優先級由composite
密鑰下列出存儲庫的順序決定。在上面的示例中,首先列出Subversion存儲庫,因此在Subversion存儲庫中找到的值將覆蓋在其中一個Git存儲庫中爲相同屬性找到的值。在爲rex
Git存儲庫中的相同屬性找到的值之前,將使用Git存儲庫中找到的值walter
。
如果只想從每個不同類型的存儲庫中提取配置數據,則可以composite
在配置服務器的應用程序屬性或YAML文件中啓用相應的配置文件,而不是配置文件。例如,如果要從單個Git存儲庫和單個HashiCorp Vault服務器提取配置數據,可以爲配置服務器設置以下屬性:
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> profiles</span>:
<span style="color:#7f007f"> active</span>:git <span style="color:#7f0055"><strong>,</strong></span> vault
<span style="color:#7f007f"> cloud</span>:
<span style="color:#7f007f"> config</span>:
<span style="color:#7f007f"> server</span>:
<span style="color:#7f007f"> git</span>:
<span style="color:#7f007f"> uri</span>:file:/// path / to / git / repo
<span style="color:#7f007f"> order</span>:2
<span style="color:#7f007f"> vault</span>:
<span style="color:#7f007f"> host</span>:127.0。0.1
<span style="color:#7f007f"> 端口</span>:8200
<span style="color:#7f007f"> 訂單</span>:1</span></span>
使用此配置,優先級可以由order
屬性確定。您可以使用該order
屬性指定所有存儲庫的優先級順序。order
屬性的數值越低,它的優先級越高。存儲庫的優先級順序有助於解決包含相同屬性值的存儲庫之間的任何潛在衝突。
如果複合環境包含Vault服務器,如上例所示,則必須在對配置服務器發出的每個請求中包含Vault令牌。請參閱Vault後端。 |
從環境存儲庫檢索值時的任何類型的故障都會導致整個複合環境失敗。 |
使用複合環境時,所有存儲庫都必須包含相同的標籤。如果您具有與前面示例中的環境類似的環境,並且您使用 |
自定義複合環境存儲庫
除了使用Spring Cloud中的一個環境存儲庫之外,您還可以提供自己的EnvironmentRepository
bean作爲複合環境的一部分。爲此,您的bean必須實現該EnvironmentRepository
接口。如果要EnvironmentRepository
在複合環境中控制自定義的優先級,還應實現該Ordered
接口並覆蓋該getOrdered
方法。如果您未實現該Ordered
接口,EnvironmentRepository
則優先級最低。
5.1.10Property覆蓋
Config Server具有“ 覆蓋 ”功能,允許操作員爲所有應用程序提供配置屬性。使用普通Spring Boot掛鉤的應用程序不會意外更改被覆蓋的屬性。要聲明覆蓋,請添加名稱 - 值對的映射spring.cloud.config.server.overrides
,如以下示例所示:
<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"> server</span>:
<span style="color:#7f007f"> overrides</span>:
<span style="color:#7f007f"> foo</span>:bar</span></span>
上述示例使得所有配置客戶端應用程序都可以讀取foo=bar
,而與其自身配置無關。
配置系統不能強制應用程序以任何特定方式使用配置數據。因此,覆蓋是不可執行的。但是,它們確實爲Spring Cloud Config客戶端提供了有用的默認行爲。 |
通常,Spring環境佔位符 |
在YAML中,您不需要逃避反斜槓本身。但是,在屬性文件中,在服務器上配置替代時,需要轉義反斜槓。 |
您可以通過spring.cloud.config.overrideNone=true
在遠程存儲庫中設置標誌(默認值爲false),將客戶端中所有覆蓋的優先級更改爲更像默認值,讓應用程序在環境變量或系統屬性中提供自己的值。
5.2健康指標
Config Server附帶一個運行狀況指示器,用於檢查配置EnvironmentRepository
是否正常。默認情況下,它會詢問EnvironmentRepository
名爲的應用程序app
,default
配置文件以及EnvironmentRepository
實現提供的默認標籤。
您可以配置運行狀況指示器以檢查更多應用程序以及自定義配置文件和自定義標籤,如以下示例所示:
<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"> server</span>:
<span style="color:#7f007f"> health</span>:
<span style="color:#7f007f"> repositories</span>:
<span style="color:#7f007f"> myservice</span>:
<span style="color:#7f007f"> label</span>:mylabel
<span style="color:#7f007f"> myservice-dev</span>:
<span style="color:#7f007f"> name</span>:myservice
<span style="color:#7f007f"> profiles</span>:development</span></span>
您可以通過設置禁用健康指標spring.cloud.config.server.health.enabled=false
。
5.3安全
您可以以對您有意義的任何方式保護您的Config Server(從物理網絡安全到OAuth2承載令牌),因爲Spring Security和Spring Boot爲許多安全安排提供支持。
要使用默認的Spring Boot配置的HTTP Basic安全性,請在類路徑中包含Spring Security(例如,通過spring-boot-starter-security
)。默認值是用戶名user
和隨機生成的密碼。隨機密碼在實踐中沒有用,因此我們建議您配置密碼(通過設置spring.security.user.password
)並對其進行加密(有關如何執行此操作的說明,請參閱下文)。
5.4加密和解密
重要 | |
---|---|
要使用加密和解密功能,您需要在JVM中安裝全功能JCE(默認情況下不包括它)。您可以從Oracle 下載“ Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files ”並按照安裝說明進行操作(實質上,您需要將JRE lib / security目錄中的兩個策略文件替換爲您下載的那些)。 |
如果遠程屬性源包含加密內容(以...開頭的值{cipher}
),則在通過HTTP發送到客戶端之前對它們進行解密。此設置的主要優點是,屬性值在“ 靜止 ”時不必是純文本格式(例如,在git存儲庫中)。如果某個值無法解密,則會從屬性源中刪除invalid
該值,並添加一個附加屬性,該屬性具有相同的鍵但前綴爲“ 不適用 ”(通常<n/a>
)的值。這主要是爲了防止密文被用作密碼並意外泄露。
如果爲配置客戶端應用程序設置遠程配置存儲庫,則它可能包含application.yml
類似於以下內容:
application.yml。
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> datasource</span>:
<span style="color:#7f007f"> 用戶名</span>:dbuser
<span style="color:#7f007f"> 密碼</span>:<span style="color:#2a00ff">'{cipher} FKSAJDFGYOS8F7GLHAKERGFHLSAJ'</span></span></span>
.properties文件中的加密值不得用引號括起來。否則,該值不會被解密。以下示例顯示了可行的值:
application.properties。
<span style="color:#333333"><span style="color:#000000">spring.datasource.username:dbuser
spring.datasource.password:{cipher} FKSAJDFGYOS8F7GLHAKERGFHLSAJ</span></span>
您可以安全地將此純文本推送到共享的git存儲庫,並且密碼保密。
服務器還公開/encrypt
和/decrypt
終止(假設這些是安全的並且只能由授權代理訪問)。如果編輯遠程配置文件,則可以使用Config Server通過POST到/encrypt
端點來加密值,如以下示例所示:
<span style="color:#333333"><span style="color:#000000">$ curl localhost:8888 / encrypt -d mysecret
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda</span></span>
如果您加密的值中包含需要進行URL編碼的字符,則應使用該 |
請確保不要在加密值中包含任何curl命令統計信息。將值輸出到文件可以幫助避免此問題。 |
通過/decrypt
(如果服務器配置了對稱密鑰或完整密鑰對),也可以使用反向操作,如以下示例所示:
<span style="color:#333333"><span style="color:#000000">$ curl localhost:8888 / decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
我的祕密</span></span>
如果你使用curl進行測試,那麼使用 |
獲取加密值並添加{cipher}
前綴,然後再將其放入YAML或屬性文件中,然後再提交併將其推送到遠程(可能不安全)存儲。
該/encrypt
和/decrypt
終點還兼有接受的形式路徑/*/{name}/{profiles}
,它可以用來控制每個應用程序(名稱)加密和每個配置文件的基礎,當客戶打電話到主環境資源。
要以這種精細的方式控制加密,您還必須提供一種 |
該spring
命令行客戶機(安裝彈簧雲CLI擴展)也可以用於加密和解密,因爲顯示在下面的例子:
<span style="color:#333333"><span style="color:#000000">$ spring加密mysecret --key foo
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
我的祕密</span></span>
要在文件中使用密鑰(例如用於加密的RSA公鑰),請在密鑰值前加上“@”並提供文件路徑,如以下示例所示:
<span style="color:#333333"><span style="color:#000000">$ spring encrypt mysecret --key @ $ {HOME} /.ssh / id_rsa.pub
AQAjPgt3eFZQXwt8tsHAVv / QHiY5sI2dRcR + ...</span></span>
該 |
5.5密鑰管理
Config Server可以使用對稱(共享)密鑰或非對稱密鑰(RSA密鑰對)。非對稱選擇在安全性方面是優越的,但是使用對稱密鑰通常更方便,因爲它是在單元中配置的單個屬性值bootstrap.properties
。
要配置對稱密鑰,需要設置encrypt.key
爲祕密字符串(或使用ENCRYPT_KEY
環境變量使其不受純文本配置文件的影響)。
您無法使用配置非對稱密鑰 |
要配置非對稱密鑰,請使用密鑰庫(例如,由keytool
JDK附帶的實用程序創建)。密鑰存儲屬性是encrypt.keyStore.*
與*
等於
屬性 | 描述 |
---|---|
|
包含一個 |
|
保存解鎖密鑰庫的密碼 |
|
標識要使用的商店中的哪個鍵 |
|
要創建的KeyStore的類型。默認爲 |
加密是使用公鑰完成的,並且需要私鑰進行解密。因此,原則上,如果您只想加密(並準備在本地使用私鑰解密值),則只能在服務器中配置公鑰。實際上,您可能不希望在本地進行解密,因爲它會圍繞所有客戶端傳播密鑰管理過程,而不是將其集中在服務器中。另一方面,如果您的配置服務器相對不安全且只有少數客戶端需要加密屬性,那麼它可能是一個有用的選項。
5.6創建用於測試的密鑰庫
要創建用於測試的密鑰庫,可以使用類似於以下內容的命令:
<span style="color:#333333"><span style="color:#000000">$ keytool -genkeypair -alias mytestkey -keyalg RSA \
-dname“CN = Web服務器,OU =單位,O =組織,L =城市,S =州,C = US”
-keypass changeme -keystore server.jks -storepass letmein</span></span>
將server.jks
文件放在類路徑中(例如),然後在您bootstrap.yml
的Config Server中創建以下設置:
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">encrypt</span>:
<span style="color:#7f007f"> keyStore</span>:
<span style="color:#7f007f"> location</span>:classpath:/server.jks
<span style="color:#7f007f"> 密碼</span>:letmein
<span style="color:#7f007f"> 別名</span>:mytestkey
<span style="color:#7f007f"> secret</span>:changeme</span></span>
5.7使用多個鍵和鍵旋轉
除了{cipher}
加密屬性值中的前綴之外,Config Server 還會{name:value}
在(Base64編碼的)密碼文本開始之前查找零個或多個前綴。密鑰傳遞給a TextEncryptorLocator
,它可以執行TextEncryptor
爲密碼定位所需的任何邏輯。如果已配置密鑰庫(encrypt.keystore.location
),則默認定位器將查找具有key
前綴提供的別名的密鑰,密碼文本類似於以下內容:
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">foo</span>:
<span style="color:#7f007f"> bar</span>:`{cipher} {key:testkey} ...`</span></span>
定位器查找名爲“testkey”的密鑰。也可以使用{secret:…}
前綴中的值來提供祕密。但是,如果未提供,則默認使用密鑰庫密碼(這是您在構建密鑰庫時未獲得的密碼)。如果您確實提供了祕密,則還應使用自定義加密祕密SecretLocator
。
當密鑰僅用於加密幾個字節的配置數據時(即,它們未在其他地方使用),在加密方面幾乎不需要密鑰輪換。但是,您可能偶爾需要更改密鑰(例如,在發生安全漏洞的情況下)。在這種情況下,所有客戶端都需要更改其源配置文件(例如,在git中)並{key:…}
在所有密碼中使用新的前綴。請注意,客戶端需要首先檢查Config Server密鑰庫中的密鑰別名是否可用。
如果您想讓Config Server處理所有加密和解密, |
5.8提供加密屬性
有時您希望客戶端在本地解密配置,而不是在服務器中執行此操作。在這種情況下,如果你提供的encrypt.*
配置定位的關鍵,你仍然可以擁有/encrypt
和/decrypt
終點,但你需要通過將明確地關掉傳出性質的解密spring.cloud.config.server.encrypt.enabled=false
在bootstrap.[yml|properties]
。如果您不關心端點,那麼如果您不配置密鑰或啓用標誌,它應該可以工作。