使用 Spring Cloud Config 統(tǒng)一管理配置,別再到處放配置文件了!
1 簡述
官方文檔對Spring Cloud Config的描述如下:
Spring Cloud Config為分布式系統(tǒng)中的外部配置提供服務(wù)器和客戶端支持,使用Config Server,您可以在所有環(huán)境中管理應(yīng)用程序的外部屬性??蛻舳撕头?wù)器上的概念映射與Spring Environment和PropertySource抽象相同。
因此它們與Spring應(yīng)用程序非常契合,但可以與任何以任何語言運行的應(yīng)用程序一起使用。隨著應(yīng)用程序通過從開發(fā)人員到測試和生產(chǎn)的部署流程,您可以管理這些環(huán)境之間的配置,并確定應(yīng)用程序具有遷移時需要運行的一切。
服務(wù)器存儲后端的默認實現(xiàn)使用git,因此它輕松支持標簽版本的配置環(huán)境,以及可以訪問用于管理內(nèi)容的各種工具。很容易添加替代實現(xiàn),并使用Spring配置將其插入。
1.1 配置中心存在的意義
一個應(yīng)用中不只是代碼,還需要連接資源和其它應(yīng)用,經(jīng)常有很多需要外部設(shè)置的項去調(diào)整應(yīng)用行為,如切換不同的數(shù)據(jù)庫,設(shè)置功能開關(guān)等。
隨著系統(tǒng)微服務(wù)的不斷增加,首要考慮的是系統(tǒng)的可伸縮、可擴展性好,隨之就是一個配置管理的問題。各自管各自的開發(fā)時沒什么問題,到了線上之后管理就會很頭疼,到了要大規(guī)模更新就更煩了。
而且你不可能停止你的服務(wù)集群去更新的你配置,這是不現(xiàn)實的做法,因此Spring Cloud配置中心就是一個比較好的解決方案,下圖就是一個Spring Cloud配置中心的解決方案:

架構(gòu)圖如下:

常見的配置中心的實現(xiàn)方法有:
硬編碼(缺點:需要修改代碼,風險大) 放在xml等配置文件中,和應(yīng)用一起打包(缺點:需要重新打包和重啟) 文件系統(tǒng)中(缺點:依賴操作系統(tǒng)等) 環(huán)境變量(缺點:有大量的配置需要人工設(shè)置到環(huán)境變量中,不便于管理且依賴平臺) 云端存儲(缺點:與其他應(yīng)用耦合)
Spring Cloud Config就是云端存儲配置信息的,它具有中心化、版本控制、支持動態(tài)更新、平臺獨立、語言獨立等特性。其特點是:
提供服務(wù)端和客戶端支持( spring cloud config server和spring cloud config client)集中式管理分布式環(huán)境下的應(yīng)用配置 基于Spring環(huán)境,無縫與Spring應(yīng)用集成 可用于任何語言開發(fā)的程序 默認實現(xiàn)基于git倉庫,可以進行版本管理 可替換自定義實現(xiàn)
1.1.1 Spring Cloud Config包括兩部分
1、Spring Cloud Config Server作為配置中心的服務(wù)端:
拉取配置時更新git倉庫副本,保證是最新結(jié)果 支持數(shù)據(jù)結(jié)構(gòu)豐富, yml、json、properties等配合 eureke 可實現(xiàn)服務(wù)發(fā)現(xiàn),配合 cloud bus可實現(xiàn)配置推送更新配置存儲基于 git倉庫,可進行版本管理 簡單可靠,有豐富的配套方案
2、Spring Cloud Config Client客戶端:
Spring Boot項目不需要改動任何代碼,加入一個啟動配置文件指明使用ConfigServer上哪個配置文件即可
1.1.2 SpringCloud Config與百度的disconf之類注冊中心區(qū)別
主要區(qū)別在于下面三點:
1、配置的存儲方式不同: disconf是把配置信息保存在mysql、zookeeper中,而spring cloud config是將配置保存在git/svn上 (即:配置當成源代碼一樣管理)
2、配置的管理方式不同: spring cloud config沒有類似disconf的統(tǒng)一管理界面,既然把配置都當成git之類的源碼來看待了,git的管理界面,就是配置的管理界面
3、配置變化的通知機制不同: disconf中配置變化后,依賴zk的事件watcher來通知應(yīng)用,而spring cloud config則是依賴git每次push后,觸發(fā)webhook回調(diào),最終觸發(fā)spring cloud bus(消息總線),然后由消息總線通知相關(guān)的應(yīng)用。
從配置變化的通知機制上看,如果有100個應(yīng)用節(jié)點,都依賴于統(tǒng)一配置,如果修改了配置,只想讓某幾個節(jié)點"灰度"更新配置,spring cloud config server更容易做到,這一點相對disconf更靈活
1.2 代碼示例
目前SpringCloud Config的使用主要是通過Git/SVN方式做一個配置中心,然后每個服務(wù)從其中獲取自身配置所需的參數(shù)。SpringCloud Config也支持本地參數(shù)配置的獲取。
如果使用本地存儲的方式,在application.properties 或application.yml 文件添加 spring.profiles.active=native 配置即可,它會從項目的 resources路徑下讀取配置文件。如果是讀取指定的配置文件,那么可以使用 spring.cloud.config.server.native.searchLocations = file:D:/properties/來讀取。
1.2.1 服務(wù)端
首先是服務(wù)端這塊,首先創(chuàng)建一個注冊中心,為了進行區(qū)分,創(chuàng)建一個springcloud-config-eureka的項目。
application.properties配置信息:
配置信息:
spring.application.name=springcloud-hystrix-eureka-server
server.port=8005
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/
配置說明:
spring.application.name: 這個是指定服務(wù)名稱 server.port: 服務(wù)指定的端口 eureka.client.register-with-eureka: 表示是否將自己注冊到 Eureka Server,默認是trueeureka.client.fetch-registry: 表示是否從 Eureka Server獲取注冊信息,默認為trueeureka.client.serviceUrl.defaultZone: 這個是設(shè)置與 Eureka Server交互的地址,客戶端的查詢服務(wù)和注冊服務(wù)都需要依賴這個地址
服務(wù)端這邊只需要在SpringBoot啟動類添加@EnableEurekaServer注解就可以了,該注解表示此服務(wù)是一個服務(wù)注冊中心服務(wù)。
代碼示例:
@SpringBootApplication
@EnableEurekaServer
public class ConfigEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigEurekaApplication.class, args);
System.out.println("config 注冊中心服務(wù)啟動...");
}
}
創(chuàng)建好了注冊中心之后,我們再來創(chuàng)建一個配置中心,用于管理配置。
創(chuàng)建一個springcloud-config-server的項目。然后在application.properties配置文件添加如下配置:
配置信息:
spring.application.name=springcloud-config-server
server.port=9005
eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/
spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study/
spring.cloud.config.server.git.search-paths = /springcloud-config/config-repo
spring.cloud.config.server.git.username =
spring.cloud.config.server.git.password =
配置說明:
spring.application.name: 這個是指定服務(wù)名稱 server.port:服務(wù)指定的端口 eureka.client.serviceUrl.defaultZone: 這個是設(shè)置與 Eureka Server交互的地址,客戶端的查詢服務(wù)和注冊服務(wù)都需要依賴這個地址spring.cloud.config.server.git.uri: 配置的Git倉庫的地址 spring.cloud.config.server.git.search-paths: git倉庫地址下的相對地址 多個用逗號","分割 spring.cloud.config.server.git.username: git倉庫的賬號 spring.cloud.config.server.git.password: git倉庫的密碼
注:如果想使用本地方式讀取配置信息,那么只需將
spring.cloud.config.server.git的配置改成spring.profiles.active=native,然后在resources路徑下新增一個文件即可。
這里為了進行本地配置文件測試,新建一個configtest.properties配置文件,添加如下內(nèi)容:
word=hello world
代碼這塊也很簡單,在程序主類中,額外添加@EnableConfigServer注解,該注解表示啟用config配置中心功能。代碼如下:
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
System.out.println("配置中心服務(wù)端啟動成功!");
}
}
完成上述代碼之后,我們的配置中心服務(wù)端已經(jīng)構(gòu)建完成了。
1.2.2 客戶端
我們新建一個springcloud-config-client的項目,用于做讀取配置中心的配置。pom依賴還是和配置中心一樣,不過需要新增一個配置,用于指定配置的讀取。
創(chuàng)建一個bootstrap.properties文件,并添加如下信息:
配置信息:
spring.cloud.config.name=configtest
spring.cloud.config.profile=pro
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=springcloud-config-server
eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/
配置說明:
spring.cloud.config.name: 獲取配置文件的名稱 spring.cloud.config.profile: 獲取配置的策略 spring.cloud.config.label: 獲取配置文件的分支,默認是master。如果是是本地獲取的話,則無用 spring.cloud.config.discovery.enabled: 開啟配置信息發(fā)現(xiàn) spring.cloud.config.discovery.serviceId: 指定配置中心的 service-id,便于擴展為高可用配置集群eureka.client.serviceUrl.defaultZone: 這個是設(shè)置與 Eureka Server交互的地址,客戶端的查詢服務(wù)和注冊服務(wù)都需要依賴這個地址
注:上面這些與spring-cloud相關(guān)的屬性必須配置在
bootstrap.properties中,config部分內(nèi)容才能被正確加載。因為bootstrap.properties的相關(guān)配置會先于application.properties,而bootstrap.properties的加載也是先于application.properties。需要注意的是eureka.client.serviceUrl.defaultZone要配置在bootstrap.properties,不然客戶端是無法獲取配置中心參數(shù)的,會啟動失??!
application.properties配置
spring.application.name=springcloud-config-client
server.port=9006
配置說明:
spring.application.name: 這個是指定服務(wù)名稱
server.port:服務(wù)指定的端口
程序主類代碼,和之前的基本一致。代碼如下:
代碼示例:
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
System.out.println("配置中心客戶端啟動成功!");
}
}
為了方便查詢,在控制中進行參數(shù)的獲取,并返回。@Value注解是默認是從application.properties配置文件獲取參數(shù),但是這里我們在客戶端并沒有進行配置,該配置在配置中心服務(wù)端,我們只需指定好了配置文件之后即可進行使用。
代碼示例:
@RestController
public class ClientController {
@Value("${word}")
private String word;
@RequestMapping("/hello")
public String index(@RequestParam String name) {
return name+","+this.word;
}
}
到此,客戶端項目也就構(gòu)建完成了。
1.2.3 功能測試
完成如上的工程開發(fā)之后,我們來進行測試。
1.2.3.1 本地測試
首先我們把springcloud-config-server項目的application.properties配置文件添加spring.profiles.active=native配置,注釋掉spring.cloud.config.server.git相關(guān)的配置,然后在src/main/resources目錄下新建一個configtest.properties文件,然后在里面添加一個配置word=hello world。
添加完成之后,我們依次啟動springcloud-config-eureka、springcloud-config-server、springcloud-config-client這三個項目。啟動成功之前,先看來看看配置中心服務(wù)端的配置文件獲取,在瀏覽器輸入:
http://localhost:9005/configtest-1.properties
查看該文件的配置信息。
注:配置文件的名稱是
configtest.properties,但是如果直接該名稱的話是獲取不到的,因為在配置文件名需要通過-來進行獲取,如果配置文件名稱沒有-,那么添加了-之后,會自動進行匹配搜索。
springcloud config的URL與配置文件的映射關(guān)系如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
上面的url會映射{application}-{profile}.properties對應(yīng)的配置文件,{label}對應(yīng)git上不同的分支,默認為master。
界面返回:
word: hello world
然后調(diào)用客戶端的接口,查看是否能夠獲取配置信息。在瀏覽器上輸入:
http://localhost:9006//hello?name=pancm
界面返回:
pancm,hello world
示例圖:


1.2.3.2 Git測試
在完成本地測試之后,我們把這個spring.profiles.active=native配置注釋掉,解除spring.cloud.config.server.git相關(guān)的注釋(賬號和密碼要填寫真實的),然后在git倉庫上建立一個config-repo文件夾,新建configtest-pro.properties、configtest-dev.properties兩個配置,這兩個的配置分別是word=hello world??!和word=hello world!, 然后和configtest.properties配置文件一起上傳到config-repo文件夾中。
首先在瀏覽器輸入:
http://localhost:9005/configtest-dev.properties
瀏覽器返回:
word: hello world!
然后再瀏覽器輸入:
http://localhost:9005/configtest-pro.properties
瀏覽器返回:
word: hello world!!
上傳了configtest.properties文件,但是這個文件名稱沒有-,我們想獲取其中參數(shù)的信息的話,可以在然后-隨意添加一個參數(shù),它會自動進行匹配,在瀏覽器輸入:
http://localhost:9005/configtest-1.properties
瀏覽器返回:
word: hello world
然后進行客戶端接口調(diào)用測試,在瀏覽器輸入:
http://localhost:9006/hello?name=pancm
瀏覽器返回:
pancm,Hello World!!
由于這里我配置的前綴是 pro ,所以讀取的是configtest-pro.properties文件的數(shù)據(jù),想要獲取其他的配置,修改spring.cloud.config.profile配置即可。
示例圖:

來源:blog.csdn.net/weixin_42039228/article
/details/123786902
精彩推薦:
京東一面:Redis 如何實現(xiàn)庫存扣減操作?如何防止商品被超賣?
CTO 說了,用錯@Autowired 和@Resource 的人可以領(lǐng)盒飯了
快速搭建一個網(wǎng)關(guān)服務(wù),動態(tài)路由、鑒權(quán)的流程,看完秒會(含流程圖)
徹底搞懂 SpringBoot jar 可執(zhí)行原理
