新聞中心
今天給大家介紹一下如何分析Spring Cloud Config 配置。文章的內(nèi)容小編覺得不錯(cuò),現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對(duì)大家有所幫助,下面跟著小編的思路一起來閱讀吧。
成都創(chuàng)新互聯(lián)公司專注于古雷港網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供古雷港營(yíng)銷型網(wǎng)站建設(shè),古雷港網(wǎng)站制作、古雷港網(wǎng)頁(yè)設(shè)計(jì)、古雷港網(wǎng)站官網(wǎng)定制、微信平臺(tái)小程序開發(fā)服務(wù),打造古雷港網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供古雷港網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
Spring Cloud Config Server 配置服務(wù)
Spring為擴(kuò)展配置服務(wù),提供了一個(gè)基于HTTP的資源綁定的api。(鍵值對(duì),或者YAML內(nèi)容) 此服務(wù)可以通過
@EnableConfigServer
非常容易的整合進(jìn)Spring Boot應(yīng)用中。
例如:ConfigServer.java
@SpringBootApplication @EnableConfigServer public class ConfigServer { public static void main(String[] args) { SpringApplication.run(ConfigServer.class, args); } }
默認(rèn)情況下,和Spring Boot應(yīng)用一樣運(yùn)行在8080端口,當(dāng)然也有很多種方法修改此端口。最簡(jiǎn)單的方法,設(shè)置默認(rèn)的配置資源庫(kù)。 通過在jar中
configserver.yml
文件中配置spring.config.name=configserver
;或者通過指定自己的configserver.yml
。
例如:application.properties
server.port: 8888 spring.cloud.config.server.git.uri: file://${user.home}/config-repo
${user.home}/config-repo
,是一個(gè)git資源。內(nèi)容為YAML或者properties文件內(nèi)容。
例如:
$ 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"
注意:以上使用本地文件只是為了測(cè)試。生產(chǎn)中應(yīng)該使用遠(yuǎn)程服務(wù)提供的配置資源。
1 Environment Repository 環(huán)境資源
在Config Server中,對(duì)于配置數(shù)據(jù)你想要怎么樣存儲(chǔ)呢?存儲(chǔ)策略由
Environment
中的EnvironmentRepository
來決定。同時(shí)多個(gè)Environment
之間也允許復(fù)制配置項(xiàng),甚至配置源propertySources
。
Environment
資源主要來自這三個(gè)參數(shù):
{application}
對(duì)應(yīng)著客戶端的spring.application.name配置;
{profile}
對(duì)應(yīng)著客戶端spring.profiles.active配置;
{label}
這是一個(gè)服務(wù)端功能,標(biāo)記著配置文件的版本。
資源實(shí)例通常表現(xiàn)和Srping Boot應(yīng)用加載配置文件類似:
spring.config.name
類似于{application}
參數(shù);spring.profiles.active
類似于{profiles}
參數(shù)。 對(duì)于特定配置文件的優(yōu)先級(jí)也是類似Spring Boot的規(guī)則:特定的配置會(huì)覆蓋默認(rèn)配置,并且如果指定了多個(gè),那最后一個(gè)優(yōu)先級(jí)最高。
例如:一個(gè)客戶端應(yīng)用可以配置一下引導(dǎo)配置:
bootstrap.yml
spring: application: name: foo profiles: active: dev,MySQL
普通Spring Boot應(yīng)用也可以通過環(huán)境變量或者命令行方式配置以上信息
如果資源是基于文件方式的,那系統(tǒng)會(huì)從
application.yml
創(chuàng)建一個(gè)Environment
共享給所有客戶端,并且加載foo.yml
進(jìn)行覆蓋。 如果YAML文件中有指定特定配置的話,那么這些特定配置比默認(rèn)配置擁有著更高的優(yōu)先級(jí)。 這些擁有更高優(yōu)先級(jí)的配置文件在Environment
之前,就逐個(gè)生成PropertySource
并被加載。
1.1 Git Backend 基于GIT
默認(rèn)情況下
EnvironmentRepository
是基于GIT的,這樣非常方便管理更新、物理環(huán)境也方便對(duì)修改歷史進(jìn)行審計(jì)。 可以通過spring.cloud.config.server.git.uri
配置屬性修改Config Server的本地資源庫(kù)(例如:在application.yml
中修改)。 如果設(shè)置成file:前綴,那會(huì)從本地資源進(jìn)行加載,這樣方便你快速簡(jiǎn)易的啟動(dòng)服務(wù)。但是這樣就是直接在本地資源庫(kù)上進(jìn)行操作,沒有備份。(不過如果遠(yuǎn)程服務(wù)資源是不變得情況下,這種方式也無所謂。)
如果需要擴(kuò)展Config Server使其具備高可用性,那你需要將所有的服務(wù)實(shí)例指向同一個(gè)資源,這樣就工作在一個(gè)共享文件的環(huán)境下。在這個(gè)情況下最好使用ssh:協(xié)議去訪問共享文件資源,這樣可以備份資源同時(shí)可以使用本地緩存提高效率。
資源實(shí)例會(huì)把HTTP資源中的
{label}
映射成git標(biāo)簽(commit id, branch name 或者 tag) 如果git分支或者標(biāo)簽名上有斜杠"/"那映射成HTTP URL時(shí)會(huì)自動(dòng)替換成"_"。使用括號(hào)、空格時(shí)需要小心。(例如使用cmd時(shí)需要加上雙引號(hào))
1.1.1 Placeholders in Git URI :git uri 中的占位符
當(dāng)需要時(shí),Spring Cloud Config Server 支持在GIT URI中使用
{application}
、{profile}
、{label}
三個(gè)占位符,但是要記住{label}
總是會(huì)映射成git的標(biāo)簽。
spring: cloud: config: server: git: uri: https://github.com/myorg/{application}
1.1.2 Pattern Matching and Multiple Repositories 正則與多資源庫(kù)
在應(yīng)用配置文件與特定配置文件中可以同過正則表達(dá)式來支持更為復(fù)雜的情況??梢栽?code>{application}/{profile}中可以使用通配符進(jìn)行匹配,如果有多個(gè)值可以使用逗號(hào)分隔。
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}
沒有匹配到任何資源,則使用spring.cloud.config.server.git.uri
配置的默認(rèn)URI。
上面例子中
pattern
屬性是一個(gè)YAML數(shù)組,也可以使用YAML數(shù)組格式來定義。這樣可以設(shè)置成多個(gè)配個(gè)配置文件。
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
每個(gè)資源庫(kù)有一個(gè)可選的配置,用來指定掃描路徑。
spring: cloud: config: server: git: uri: https://github.com/spring-cloud-samples/config-repo searchPaths: foo,bar*
這樣系統(tǒng)就會(huì)自動(dòng)搜索foo的子目錄,以及以bar開頭的文件夾中的子目錄。
默認(rèn)情況下,當(dāng)?shù)谝淮握?qǐng)求配置時(shí),系統(tǒng)復(fù)制遠(yuǎn)程資源庫(kù)。系統(tǒng)也可以配置成一啟動(dòng)就復(fù)制遠(yuǎn)程資源庫(kù)。
spring: cloud: config: server: git: uri: https://git/common/config-repo.git repos: team-a: pattern: team-a-* cloneOnStart: true uri: http://git/team-a/config-repo.git team-b: pattern: team-b-* cloneOnStart: false uri: http://git/team-b/config-repo.git team-c: pattern: team-c-* uri: http://git/team-a/config-repo.git
上面的例子中team-a的資源庫(kù)會(huì)在啟動(dòng)時(shí)就從遠(yuǎn)程資源庫(kù)進(jìn)行復(fù)制,其他的則等到第一次請(qǐng)求時(shí)才從遠(yuǎn)程資源庫(kù)復(fù)制。
如果遠(yuǎn)程資源庫(kù)設(shè)置了權(quán)限認(rèn)證,則可以如下配置:
spring: cloud: config: server: git: uri: https://github.com/spring-cloud-samples/config-repo username: trolley password: strongpassword
如果你不是用HTTPS和用戶認(rèn)證,可以使用SSH uri 的格式。例如:
[email protected]:configuration/cloud-configuration
這樣你就需要先有SSH的key。 這種方式系統(tǒng)會(huì)使用JGit
庫(kù)進(jìn)行訪問,可以去查看相關(guān)文檔??梢栽?code>~/.git/config中設(shè)置HTTPS代理配置,或者也可以通過JVM參數(shù)-Dhttps.proxyHost
、-Dhttps.proxyPort
來配置代理。
提示: 當(dāng)你不知道你的
~/.git
目錄時(shí),可以使用git config --global
來指定。例如:git config --global http.sslVerify false
3.2.1.1.3 Placeholders in Git Search Paths : GIT路徑搜索中的占位符
Spring Cloud 的 Config Server 也支持在搜索路徑中使用
{application}
、{profile}
、{label}
占位符配置。例如:
spring: cloud: config: server: git: uri: https://github.com/spring-cloud-samples/config-repo searchPaths: '{application}'
1.2 File System Backend 基于文件系統(tǒng)
也有不使用git資源庫(kù)的方式,那就是從本地classpath或者文件系統(tǒng)加載配置文件。這種方式可以通過
spring.profiles.active=native
開啟。
使用file:前綴加載文件系統(tǒng),否則從classpath中加載,也可以使用
${}
樣式的環(huán)境占位符。例如:file:///${user.home}/config-repo
searchLocations
默認(rèn)值與本地Spring Boot應(yīng)用的掃描路徑一樣,都是:[classpath:/, classpath:/config, file:./, file:./config]
這樣并不用擔(dān)心application.properties
文件暴露給所有客戶端,因?yàn)樵诎l(fā)送給客戶端之前就會(huì)被清理掉。
基于文件系統(tǒng)的配置服務(wù)對(duì)于測(cè)試和快速練手來說是比較好的,如果用于生產(chǎn)環(huán)境,那就需要確保文件系統(tǒng)的可靠性,并允許共享訪問。
路徑搜索時(shí)能夠包含
{application}
、{profile}
、{label}
,這樣方便你按照目錄來管理你的配置文件。
如果在路徑搜索時(shí)不使用占位符,那也會(huì)嘗試自動(dòng)的在HTTP資源中加上
{label}
后綴,那這樣就會(huì)從不同的路徑加載到。因此,在默認(rèn)情況下不使用占位符等價(jià)于在每一個(gè)路徑后添加了/{label}/
。例如:file:/tmp/config
就等價(jià)于file:/tmp/config,file:/tmp/config/{label}
1.3 Sharing Configuration With All Applications 應(yīng)用共享配置
通過基于文件(svn,本地)資源,文件名為
application*
的資源將在所有的應(yīng)用客戶端中共享。(application.properties
,application.yml
,application-*.properties
) 可以通過這種方式來定義一個(gè)全局的默認(rèn)配置,如有必要應(yīng)用可以使用應(yīng)用指定配置對(duì)其進(jìn)行覆蓋。
1.4 Property Overrides 屬性覆蓋
Config Server 有一個(gè)屬性覆蓋的特性,允許操作者通過提供一個(gè)配置屬性去覆蓋所有應(yīng)用中的配置。通過普通的Spring Boot鉤子方式來實(shí)現(xiàn),因此應(yīng)用不需要什么改變。
聲明覆蓋僅僅需要在
spring.cloud.config.server.overrides
中配置一個(gè)鍵值對(duì)。例如:
spring: cloud: config: server: overrides: foo: bar
這樣會(huì)引起所有的應(yīng)用客戶端去讀取
foo=bar
去覆蓋自己的配置。(當(dāng)然應(yīng)用拿到新的數(shù)據(jù)后自己決定如何使用,因此,覆蓋并不是強(qiáng)制的,客戶端可以自定義拿到新數(shù)據(jù)后的行為)
提示: 使用文件方式時(shí),Spring環(huán)境中的占位符
${}
可以用""對(duì)"$"轉(zhuǎn)義,例如:\${app.foo:bar}
。當(dāng)使用YAML時(shí),YAML本身會(huì)處理,因此不需要轉(zhuǎn)義。
2.2 Health Indicator 健康指示器
Config Server 通過一個(gè)健康指示器來檢測(cè)配置的
EnvironmentRepository
是否正常工作。 默認(rèn)情況下會(huì)向EnvironmentRepository
詢問一個(gè)名字為app
的應(yīng)用配置,EnvironmentRepository
實(shí)例回應(yīng)default
配置。
可以通過配置讓健康指示器一起去檢查多個(gè)應(yīng)用的多個(gè)配置。例如:
spring: cloud: config: server: health: repositories: myservice: label: mylabel myservice-dev: name: myservice profiles: development
也可以通過配置
spring.cloud.config.server.health.enabled=false
去關(guān)閉此功能。
2.2 Security 安全
你可以按你自己的情況用任何方法對(duì)Config Server進(jìn)行安全處理。(從物理網(wǎng)絡(luò)安全到OAuth3授權(quán)token),不過通過Spring Security 結(jié)合Spring Boot能提供一種更好的方式。
使用Spring Boot默認(rèn)的基于HTTP安全方式,僅僅需要引入Spring Security依賴。(如:可以通過
spring-boot-starter-security
)
默認(rèn)情況使用一個(gè)用戶名和一個(gè)隨機(jī)產(chǎn)生的密碼,這種方式并不是很靠譜,因此,建議通過
spring-boot-starter-security
配置密碼,并對(duì)其進(jìn)行加密處理。
2.3 Encryption and Decryption 加解密
重要:要使用此特性,需要完全的JCE授權(quán),方法參見前文
如果遠(yuǎn)程資源是一個(gè)經(jīng)過加密的內(nèi)容(以
{cipher}
開頭),在發(fā)送給客戶端之前會(huì)被解密。 這樣,配置內(nèi)容就不用明文存放了。 當(dāng)直接去替換一個(gè)沒有解密的值時(shí),會(huì)被標(biāo)記為"invalid"(無效的)。 這基本上可以大部分的杜絕密鑰泄露的發(fā)生。例如:
application.yml
spring: datasource: username: dbuser password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
如果使用配置文件則加密數(shù)據(jù)不要加上雙引號(hào)。例如:
application.properties
spring.datasource.username: dbuser spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
這樣就可以安全共享此文件,同時(shí)可以保護(hù)密鑰。
這個(gè)服務(wù)通過
/encrypt
和/decrypt
端點(diǎn)向外暴露。這樣就可以用過POST方式向/encrypt
提交加密后的數(shù)據(jù)。例如:
$ curl localhost:8888/encrypt -d mysecret 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
反過來也行,通過
/decrypt
安全提交數(shù)據(jù)。(前提是已經(jīng)在服務(wù)端配置了相應(yīng)的解密KEY)
$ curl localhost:8888/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
在提交之前,存放這些加密數(shù)據(jù)存在著潛在的不安全性。
/encrypt
和/decrypt
都接受一個(gè)路徑/*/{name}/{profiles}
用于分開控制每一個(gè)應(yīng)用的密碼。
注意:如果需要為每一個(gè)應(yīng)用使用不同的密碼,則需要一個(gè)
@Bean
產(chǎn)生一個(gè)TextEncryptorLocator
對(duì)象來創(chuàng)建不同的密鑰對(duì),并給它們賦予一個(gè)名字。當(dāng)然這是可選的,默認(rèn)不需要這樣(所有應(yīng)用使用相同的密鑰)
Spring 命令行客戶端(Spring Cloud CLI)也可以使用加解密特性。例如:
$ spring encrypt mysecret --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda $ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
可以使用
@
來指定一個(gè)路徑,包含一個(gè)存放加解密key 的文件。例如:
$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
2.4 Key Management 密鑰管理
Config Server 可以使用對(duì)稱/非對(duì)稱加解密算法。使用非對(duì)稱算法擁有更好的安全性,但是對(duì)稱算法更方便。
配置對(duì)稱算法的key,只需要設(shè)置
encrypt.key
就行了。(或者使用環(huán)境變量ENCRYPT_KEY
)
配置非對(duì)稱算法key,你可以選擇在
encrypt.key
中配置一個(gè)PEM編碼的文本,也可以通過encrypt.keyStore.*
配置使用一個(gè)密鑰庫(kù)。
encrypt.keyStore.*
包括如下配置:
location 一個(gè)資源路徑
password 密鑰庫(kù)密碼
alias 被使用的密鑰標(biāo)識(shí)
通過公鑰加密,私鑰解密。因此,原則上可以在服務(wù)端只配置公鑰。但是實(shí)踐中可能很少這樣做,密鑰管理在全部客戶端處理過程都會(huì)被包含,而不僅僅是服務(wù)端。不過從另一方面說,如果服務(wù)端 真的不安全,而且只有少數(shù)幾個(gè)客戶端需要加密處理,那這樣配置也有一定的合理性。
2.5 Creating a Key Store for Testing 創(chuàng)建一個(gè)密鑰庫(kù)用于測(cè)試
可以通過如下配置來創(chuàng)建一個(gè)用于測(cè)試的密鑰庫(kù):
$ 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
文件放入classspath,然后在application.yml
中進(jìn)行以下配置:
encrypt: keyStore: location: classpath:/server.jks password: letmein alias: mytestkey secret: changeme
2.6 Using Multiple Keys and Key Rotation 使用多重密鑰以及密鑰輪換
通過添加
{cipher}
前綴來表明使用加密數(shù)據(jù),系統(tǒng)會(huì)在對(duì)密文進(jìn)行Base64解碼之前尋找{name:value}
前綴信息。密鑰通過TextEncryptorLocator
(無論哪種)實(shí)例,最終使用TextEncryptor
來完成加解密。 如果配置了密鑰庫(kù)(encrypt.keystore.location
),那默認(rèn)的執(zhí)行器(locator)就會(huì)按照配置的alias去密鑰庫(kù)中查找相應(yīng)的密鑰。例如:
foo: bar: `{cipher}{key:testkey}...`
上例中執(zhí)行器(locator)將會(huì)去查找一個(gè)叫做“testkey”的密鑰。密鑰庫(kù)的密碼可以通過
{secret:…}
來指定,但是如非必要一般不指定。如果想使用密鑰庫(kù)密碼,那建議使用定制SecretLocator
對(duì)其加密處理。
如果只是對(duì)很少的配置數(shù)據(jù)進(jìn)行加密的話,密鑰輪換基本上沒有必要。 但是,偶還還是會(huì)有需求去修改密鑰的場(chǎng)景。在這種情況下,所有的客戶端都需要改變?cè)磁渲梦募ㄈ纾篻it)來使用新的
{key:…}
,最好還要事先檢查密鑰庫(kù)中的密鑰。
提示:
{name:value}
也可以在/encrypt
數(shù)據(jù)請(qǐng)求時(shí)使用。
2.7 Serving Encrypted Properties 提供加密屬性
有的時(shí)候需要客戶端對(duì)配置數(shù)進(jìn)行解密,而不是在服務(wù)端解密。這種情況下,仍然可以通過
/encrypt
和/decrypt
端點(diǎn)訪問。那就需要明確指定配置數(shù)據(jù)在服務(wù)端發(fā)出時(shí)不解密:spring.cloud.config.server.encrypt.enabled=false
。如果不關(guān)系端點(diǎn)訪問,那就既不要配置密鑰也不要開啟此配置。
以上就是如何分析Spring Cloud Config 配置的全部?jī)?nèi)容了,更多與如何分析Spring Cloud Config 配置相關(guān)的內(nèi)容可以搜索創(chuàng)新互聯(lián)之前的文章或者瀏覽下面的文章進(jìn)行學(xué)習(xí)哈!相信小編會(huì)給大家增添更多知識(shí),希望大家能夠支持一下創(chuàng)新互聯(lián)!
當(dāng)前名稱:如何分析SpringCloudConfig配置
文章出自:http://fisionsoft.com.cn/article/jjcseo.html