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