摘要:,這是標(biāo)記配置文件集版本化的服務(wù)器端特性。要配置對(duì)稱(chēng)密鑰,需要將設(shè)置為秘密字符串或使用環(huán)境變量將其排除在純文本配置文件之外。
Spring Cloud Config Server
Spring Cloud Config Server為外部配置提供基于HTTP資源的API(名稱(chēng)—值對(duì)或等效的YAML內(nèi)容),通過(guò)使用@EnableConfigServer注解,服務(wù)器可嵌入Spring Boot應(yīng)用程序中,因此,以下應(yīng)用程序是配置服務(wù)器:
ConfigServer.java
@SpringBootApplication @EnableConfigServer public class ConfigServer { public static void main(String[] args) { SpringApplication.run(ConfigServer.class, args); } }
與所有Spring Boot應(yīng)用程序一樣,它默認(rèn)在端口8080上運(yùn)行,但你可以通過(guò)各種方式將其切換到更傳統(tǒng)的端口8888。最簡(jiǎn)單的,也是設(shè)置默認(rèn)配置存儲(chǔ)庫(kù),是通過(guò)spring.config.name=configserver啟動(dòng)它(Config Server jar中有一個(gè)configserver.yml),另一種方法是使用你自己的application.properties,如以下示例所示:
application.properties
server.port: 8888 spring.cloud.config.server.git.uri: file://${user.home}/config-repo
其中${user.home}/config-repo是一個(gè)包含YAML和屬性文件的git存儲(chǔ)庫(kù)。
在Windows上,如果文件URL是絕對(duì)的驅(qū)動(dòng)器前綴,則需要額外的“/”(例如,file:///${user.home}/config-repo)。
以下清單顯示了在前面的示例中創(chuàng)建git存儲(chǔ)庫(kù)的步驟:
$ cd $HOME $ mkdir config-repo $ cd config-repo $ git init . $ echo info.foo: bar > application.properties $ git add -A . $ git commit -m "Add application.properties"
使用git存儲(chǔ)庫(kù)的本地文件系統(tǒng)僅用于測(cè)試,生產(chǎn)中你應(yīng)該使用服務(wù)器托管配置存儲(chǔ)庫(kù)。
如果只保留文本文件,則配置存儲(chǔ)庫(kù)的初始克隆可以快速有效,如果存儲(chǔ)二進(jìn)制文件(尤其是大型文件),則第一次請(qǐng)求配置可能會(huì)出現(xiàn)延遲或服務(wù)器中遇到內(nèi)存不足錯(cuò)誤。環(huán)境存儲(chǔ)庫(kù)
應(yīng)該在哪里存儲(chǔ)配置服務(wù)器的配置數(shù)據(jù)?管理此行為的策略是EnvironmentRepository,為Environment對(duì)象提供服務(wù),此Environment是Spring Environment中域的淺拷貝(包括propertySources作為主要功能),Environment資源由三個(gè)變量參數(shù)化:
{application},它映射到客戶端的spring.application.name。
{profile},它映射到客戶端(逗號(hào)分隔列表)的spring.profiles.active。
{label},這是標(biāo)記配置文件集“版本化”的服務(wù)器端特性。
存儲(chǔ)庫(kù)實(shí)現(xiàn)通常表現(xiàn)得像Spring Boot應(yīng)用程序,從spring.config.name等于{application}參數(shù),spring.profiles.active等于{profiles}參數(shù)加載配置文件。配置文件的優(yōu)先規(guī)則也與常規(guī)Spring Boot應(yīng)用程序中的規(guī)則相同:活動(dòng)配置文件優(yōu)先于默認(rèn)配置文件,如果有多個(gè)配置文件,則最后一個(gè)配置文件獲勝(類(lèi)似于向Map添加條目)。
以下示例客戶端應(yīng)用程序具有此bootstrap配置:
bootstrap.yml
spring: application: name: foo profiles: active: dev,mysql
像通常一樣,Spring Boot應(yīng)用程序也可以通過(guò)環(huán)境變量或命令行參數(shù)來(lái)設(shè)置這些屬性。
如果存儲(chǔ)庫(kù)是基于文件的,則服務(wù)器從application.yml(在所有客戶端之間共享)和foo.yml(以foo.yml優(yōu)先)創(chuàng)建Environment。如果YAML文件中包含指向Spring配置文件的文檔,那么這些文檔將以更高的優(yōu)先級(jí)應(yīng)用(按列出的配置文件的順序)。如果存在特定配置文件的YAML(或?qū)傩裕┪募瑒t這些文件的優(yōu)先級(jí)也高于默認(rèn)值,較高的優(yōu)先級(jí)轉(zhuǎn)換為Environment中先前列出的PropertySource(這些相同的規(guī)則適用于獨(dú)立的Spring Boot應(yīng)用程序)。
你可以將spring.cloud.config.server.accept-empty設(shè)置為false,以便如果應(yīng)用程序找不到,則Server返回HTTP 404狀態(tài),默認(rèn)情況下,此標(biāo)志設(shè)置為true。
健康指示器Config Server附帶一個(gè)健康指示器,用于檢查配置的EnvironmentRepository是否正常工作,默認(rèn)情況下,它會(huì)向EnvironmentRepository請(qǐng)求名為app的應(yīng)用程序、default配置文件以及EnvironmentRepository實(shí)現(xiàn)提供的默認(rèn)標(biāo)簽。
你可以配置健康指示器以檢查更多應(yīng)用程序以及自定義配置文件和自定義標(biāo)簽,如以下示例所示:
spring: cloud: config: server: health: repositories: myservice: label: mylabel myservice-dev: name: myservice profiles: development
你可以通過(guò)設(shè)置spring.cloud.config.server.health.enabled=false來(lái)禁用監(jiān)控指示器。
安全性你可以以對(duì)你有意義的任何方式保護(hù)你的Config Server(從物理網(wǎng)絡(luò)安全到OAuth2承載令牌),因?yàn)镾pring Security和Spring Boot為許多安全安排提供支持。
要使用默認(rèn)的Spring Boot配置的HTTP Basic安全性,請(qǐng)?jiān)陬?lèi)路徑中包含Spring Security(例如,通過(guò)spring-boot-starter-security),默認(rèn)值為user的用戶名和隨機(jī)生成的密碼,隨機(jī)密碼在實(shí)踐中沒(méi)有用,因此建議你配置密碼(通過(guò)設(shè)置spring.security.user.password)并對(duì)其進(jìn)行加密(有關(guān)如何執(zhí)行此操作的說(shuō)明,請(qǐng)參閱下文)。
加密和解密要使用加密和解密特性,你需要在JVM中安裝完整的JCE(默認(rèn)情況下不包括),你可以從Oracle下載“Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files”并按照安裝說(shuō)明進(jìn)行操作(實(shí)際上,你需要將JRE lib/security目錄中的兩個(gè)策略文件替換為你下載的策略文件)。
如果遠(yuǎn)程屬性源包含加密內(nèi)容(以{cipher}開(kāi)頭的值),則在通過(guò)HTTP發(fā)送到客戶端之前對(duì)它們進(jìn)行解密,此設(shè)置的主要優(yōu)點(diǎn)是,屬性值在“靜止”時(shí)不必是純文本格式(例如,在git存儲(chǔ)庫(kù)中)。如果某個(gè)值無(wú)法解密,則會(huì)從屬性源中刪除該值,并添加一個(gè)附加屬性,該屬性具有相同的鍵但前綴為invalid,且值為“不適用”(通常為
如果為配置客戶端應(yīng)用程序設(shè)置遠(yuǎn)程配置存儲(chǔ)庫(kù),則它可能包含類(lèi)似于以下內(nèi)容的application.yml:
spring: datasource: username: dbuser password: "{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ"
.properties文件中的加密值不能用引號(hào)括起來(lái),否則,該值不會(huì)被解密,以下示例顯示了有效的值:
application.properties
spring.datasource.username: dbuser spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
你可以安全地將此純文本推送到共享的git存儲(chǔ)庫(kù),并且密碼仍然受到保護(hù)。
服務(wù)器還公開(kāi)/encrypt和/decrypt端點(diǎn)(假設(shè)這些端點(diǎn)是安全的并且只能由授權(quán)代理訪問(wèn)),如果編輯遠(yuǎn)程配置文件,則可以使用Config Server通過(guò)POST到/encrypt端點(diǎn)來(lái)加密值,如以下示例所示:
$ curl localhost:8888/encrypt -d mysecret 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
如果你加密的值中包含需要進(jìn)行URL編碼的字符,則應(yīng)使用--data-urlencode選項(xiàng)進(jìn)行curl以確保它們已正確編碼。
請(qǐng)確保不要在加密值中包含任何curl命令統(tǒng)計(jì)信息,將值輸出到文件可以幫助避免此問(wèn)題。
通過(guò)/decrypt也可以使用反向操作(前提是服務(wù)器配置了對(duì)稱(chēng)密鑰或完整密鑰對(duì)),如以下示例所示:
$ curl localhost:8888/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
如果你用curl測(cè)試,那么使用--data-urlencode(替代-d)或設(shè)置一個(gè)顯式的Content-Type: text/plain來(lái)確保curl在有特殊字符時(shí)正確編碼數(shù)據(jù)("+"特別棘手)。
獲取加密值并添加{cipher}前綴,然后再將其放入YAML或?qū)傩晕募?,然后再提交并將其推送到遠(yuǎn)程(可能不安全)存儲(chǔ)。
/encrypt和/decrypt端點(diǎn)也接受/*/{name}/{profiles}形式的路徑,當(dāng)客戶端調(diào)用主環(huán)境資源時(shí),可用于在每個(gè)應(yīng)用程序(名稱(chēng))和每個(gè)配置文件的基礎(chǔ)上控制加密。
要以這種精細(xì)的方式控制加密,你還必須提供類(lèi)型為TextEncryptorLocator的@Bean,它為每個(gè)名稱(chēng)和配置文件創(chuàng)建不同的加密器,默認(rèn)情況下提供的那個(gè)不會(huì)這樣做(所有加密都使用相同的密鑰)。
spring命令行客戶端(安裝了Spring Cloud CLI擴(kuò)展)也可用于加密和解密,如以下示例所示:
$ spring encrypt mysecret --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda $ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
要使用文件中的密鑰(例如用于加密的RSA公鑰),請(qǐng)?jiān)诿荑€值前加上“@”并提供文件路徑,如以下示例所示:
$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
--key參數(shù)是必需的(盡管有--前綴)。密鑰管理
Config Server可以使用對(duì)稱(chēng)(共享)密鑰或非對(duì)稱(chēng)密鑰(RSA密鑰對(duì)),非對(duì)稱(chēng)選擇在安全性方面更優(yōu)越,但使用對(duì)稱(chēng)密鑰通常更方便,因?yàn)樗窃?b>bootstrap.properties中配置的單個(gè)屬性值。
要配置對(duì)稱(chēng)密鑰,需要將encrypt.key設(shè)置為秘密字符串(或使用ENCRYPT_KEY環(huán)境變量將其排除在純文本配置文件之外)。
無(wú)法使用encrypt.key配置非對(duì)稱(chēng)密鑰。
要配置非對(duì)稱(chēng)密鑰,請(qǐng)使用密鑰庫(kù)(例如,由JDK附帶的keytool實(shí)用工具創(chuàng)建),密鑰庫(kù)屬性是encrypt.keyStore.*,*等于:
屬性 | 描述 |
---|---|
encrypt.keyStore.location | 包含Resource的位置 |
encrypt.keyStore.password | 保存解鎖密鑰庫(kù)的密碼 |
encrypt.keyStore.alias | 標(biāo)識(shí)要使用存儲(chǔ)中的哪個(gè)密鑰 |
加密是使用公鑰完成的,并且需要私鑰進(jìn)行解密,因此,原則上,如果只想加密(并準(zhǔn)備使用私鑰本地解密值),則只配置服務(wù)器中的公鑰。實(shí)際上,你可能不希望在本地進(jìn)行解密,因?yàn)樗鼤?huì)圍繞所有客戶端傳播密鑰管理過(guò)程,而不是將其集中在服務(wù)器中,另一方面,如果你的配置服務(wù)器相對(duì)不安全且只有少數(shù)客戶端需要加密屬性,那么它可能是一個(gè)有用的選項(xiàng)。
創(chuàng)建用于測(cè)試的密鑰庫(kù)要?jiǎng)?chuàng)建用于測(cè)試的密鑰庫(kù),可以使用類(lèi)似于以下內(nèi)容的命令:
$ keytool -genkeypair -alias mytestkey -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass changeme -keystore server.jks -storepass letmein
將server.jks文件放在類(lèi)路徑中(例如),然后在bootstrap.yml中為Config Server創(chuàng)建以下設(shè)置:
encrypt: keyStore: location: classpath:/server.jks password: letmein alias: mytestkey secret: changeme使用多個(gè)密鑰和密鑰輪換
除了加密屬性值中的{cipher}前綴之外,Config Server還會(huì)在(Base64編碼)密文開(kāi)頭之前查找零個(gè)或多個(gè){name:value}前綴,密鑰傳遞給TextEncryptorLocator,它可以執(zhí)行為密文定位TextEncryptor所需的任何邏輯。如果已配置密鑰庫(kù)(encrypt.keystore.location),則默認(rèn)定位器將查找具有key前綴提供的別名的密鑰,密文類(lèi)似于以下內(nèi)容:
foo: bar: `{cipher}{key:testkey}...`
定位器查找名為“testkey”的密鑰,也可以通過(guò)在前綴中使用{secret:…?}值來(lái)提供秘密,但是,如果未提供,則默認(rèn)使用密鑰庫(kù)密碼(這是你在構(gòu)建密鑰庫(kù)時(shí)未指定秘密),如果你提供秘密,你還應(yīng)該使用自定義SecretLocator加密秘密。
當(dāng)密鑰僅用于加密幾個(gè)字節(jié)的配置數(shù)據(jù)時(shí)(也就是說(shuō),它們沒(méi)有在其他地方使用),在加密方面幾乎不需要密鑰輪換。但是,你可能偶爾需要更改密鑰(例如,在發(fā)生安全漏洞時(shí)),在這種情況下,所有客戶端都需要更改其源配置文件(例如,在git中)并在所有密文中使用新的{key:…?}前綴,請(qǐng)注意,客戶端需要首先檢查Config Server密鑰庫(kù)中的密鑰別名是否可用。
如果你想讓Config Server處理所有加密和解密,{name:value}前綴也可以作為純文本添加發(fā)布到/encrypt端點(diǎn)。提供加密屬性
有時(shí)你希望客戶端在本地解密配置,而不是在服務(wù)器中執(zhí)行此操作。在這種情況下,如果你提供encrypt.*配置來(lái)定位密鑰,你仍然可以擁有/encrypt和/decrypt端點(diǎn),但是你需要通過(guò)在bootstrap.[yml|properties]中放置spring.cloud.config.server.encrypt.enabled=false來(lái)明確地關(guān)閉輸出屬性的解密,如果你不關(guān)心端點(diǎn),那么如果你不配置密鑰或啟用標(biāo)志,它應(yīng)該可以工作。
提供選擇性的格式環(huán)境端點(diǎn)的默認(rèn)JSON格式非常適合Spring應(yīng)用程序使用,因?yàn)樗苯佑成涞?b>Environment抽象,如果你愿意,可以通過(guò)向資源路徑添加后綴(“.yml”,“.yaml”或“.properties”)來(lái)使用與YAML或Java屬性相同的數(shù)據(jù),對(duì)于不關(guān)心JSON端點(diǎn)結(jié)構(gòu)或它們提供的額外元數(shù)據(jù)的應(yīng)用程序來(lái)說(shuō),這可能很有用(例如,不使用Spring的應(yīng)用程序可能會(huì)受益于此方法的簡(jiǎn)單性)。
YAML和屬性表示有一個(gè)額外的標(biāo)志(作為名為resolvePlaceholders的布爾查詢參數(shù)提供),表示源文檔中的占位符(在標(biāo)準(zhǔn)的Spring ${…?}形式)應(yīng)該在渲染之前在輸出中解析(在可能的情況),對(duì)于不了解Spring占位符約定的消費(fèi)者而言,這是一個(gè)有用的特性。
使用YAML或?qū)傩愿袷酱嬖谙拗?,主要與元數(shù)據(jù)丟失有關(guān)。例如,JSON為屬性源的有序列表結(jié)構(gòu),其名稱(chēng)與源相關(guān),YAML和屬性形式合并為單個(gè)映射,即使值的來(lái)源有多個(gè)源,并且原始源文件的名稱(chēng)丟失。此外,YAML表示不一定是支持存儲(chǔ)庫(kù)中YAML源的可靠表示,它由一個(gè)平面屬性源列表構(gòu)成,必須對(duì)鍵的形式進(jìn)行假設(shè)。
上一篇:Spring Cloud Config快速入門(mén) 下一篇:提供純文本文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/74102.html
摘要:應(yīng)用程序可以立即利用或應(yīng)用程序開(kāi)發(fā)人員提供的其他外部屬性源,它還提取了一些與變化事件相關(guān)的額外有用特性。標(biāo)簽也可以以逗號(hào)分隔列表的形式提供,在這種情況下,列表中的項(xiàng)目將逐個(gè)嘗試,直到成功為止,在處理特性分支時(shí),此行為非常有用。 Spring Cloud Config Client Spring Boot應(yīng)用程序可以立即利用Spring Config Server(或應(yīng)用程序開(kāi)發(fā)人員提供...
摘要:快速入門(mén)這個(gè)快速入門(mén)使用的服務(wù)器和客戶端。屬性在端點(diǎn)中顯示為高優(yōu)先級(jí)屬性源,如以下示例所示。名為的屬性源包含值為且具有最高優(yōu)先級(jí)的屬性。屬性源名稱(chēng)中的是存儲(chǔ)庫(kù),而不是配置服務(wù)器。 Spring Cloud Config快速入門(mén) 這個(gè)快速入門(mén)使用Spring Cloud Config Server的服務(wù)器和客戶端。 首先,啟動(dòng)服務(wù)器,如下所示: $ cd spring-cloud-con...
摘要:在這種情況下,名為的可選屬性非常有用,它是一個(gè)標(biāo)志,指示服務(wù)器是否應(yīng)從其自己的遠(yuǎn)程存儲(chǔ)庫(kù)配置自身,默認(rèn)情況下,該標(biāo)志處于關(guān)閉狀態(tài),因?yàn)樗赡軙?huì)延遲啟動(dòng)。 嵌入Config Server Config Server作為獨(dú)立應(yīng)用程序運(yùn)行最佳,但是,如果需要,你可以將其嵌入另一個(gè)應(yīng)用程序中,為此,請(qǐng)使用@EnableConfigServer注解。在這種情況下,名為spring.cloud.c...
摘要:推送通知和許多源代碼存儲(chǔ)庫(kù)提供程序例如或通過(guò)通知你存儲(chǔ)庫(kù)中的更改,你可以通過(guò)提供程序的用戶界面將配置為以及你感興趣的一組事件。要覆蓋該行為時(shí)使用的策略是,它接受請(qǐng)求和作為參數(shù),并返回已更改的文件路徑列表。 推送通知和Spring Cloud Bus 許多源代碼存儲(chǔ)庫(kù)提供程序(例如Github、Gitlab、Gitea、Gitee、Gogs或Bitbucket)通過(guò)webhook通知你存...
摘要:它們的優(yōu)先級(jí)低于或以及作為創(chuàng)建應(yīng)用程序過(guò)程的正常部分添加到子級(jí)的任何其他屬性源。為引導(dǎo)配置類(lèi)使用單獨(dú)的包名稱(chēng),并確?;蜃⒔獾呐渲妙?lèi)尚未涵蓋該名稱(chēng)。在這種情況下,它會(huì)在刷新時(shí)重建,并重新注入其依賴項(xiàng),此時(shí),它們將從刷新的重新初始化。 Spring Cloud Context:應(yīng)用程序上下文服務(wù) Spring Boot有一個(gè)關(guān)于如何使用Spring構(gòu)建應(yīng)用程序的主見(jiàn),例如,它具有通用配置文...
閱讀 1623·2023-04-26 01:36
閱讀 2785·2021-10-08 10:05
閱讀 2834·2021-08-05 09:57
閱讀 1587·2019-08-30 15:52
閱讀 1252·2019-08-30 14:12
閱讀 1375·2019-08-30 11:17
閱讀 3183·2019-08-29 13:07
閱讀 2503·2019-08-29 12:35