請(qǐng)先閱讀之前的內(nèi)容:
- Spring Cloud 學(xué)習(xí)筆記 - No.1 服務(wù)注冊(cè)發(fā)現(xiàn)
- Spring Cloud 學(xué)習(xí)筆記 - No.2 服務(wù)消費(fèi) Ribbon & Feign
Spring Cloud Config 介紹
https://cloud.spring.io/spring-cloud-config/
Spring Cloud Config provides server and client-side support for externalized configuration in a distributed system.
Spring Cloud Config 是 Spring Cloud 團(tuán)隊(duì)創(chuàng)建的一個(gè)全新項(xiàng)目,用來(lái)為分布式系統(tǒng)中的基礎(chǔ)設(shè)施和微服務(wù)應(yīng)用提供集中化的和可擴(kuò)展的外部配置支持俭驮。
它分為服務(wù)端與客戶端兩個(gè)部分:
- 服務(wù)端也稱為分布式配置中心咒精,它是一個(gè)獨(dú)立的微服務(wù)應(yīng)用,用來(lái)連接配置倉(cāng)庫(kù)(例如 Git)并為客戶端提供獲取配置信息、加密/解密信息等訪問(wèn)接口
- 客戶端則是微服務(wù)架構(gòu)中的各個(gè)微服務(wù)應(yīng)用或基礎(chǔ)設(shè)施驹马,它們通過(guò)指定的配置中心來(lái)管理應(yīng)用資源與業(yè)務(wù)相關(guān)的配置內(nèi)容卷拘,并在啟動(dòng)的時(shí)候從配置中心獲取和加載配置信息。
Spring Cloud Config 實(shí)現(xiàn)了對(duì)服務(wù)端和客戶端中環(huán)境變量 Environment
和屬性配置 PropertySource
的抽象映射氮墨,所以它除了適用于Spring 構(gòu)建的應(yīng)用程序之外纺蛆,也可以在任何其他語(yǔ)言運(yùn)行的應(yīng)用程序中使用。
由于 Spring Cloud Config 實(shí)現(xiàn)的配置中心默認(rèn)采用 Git 來(lái)存儲(chǔ)配置信息规揪,所以使用 Spring Cloud Config構(gòu)建的配置服務(wù)器桥氏,天然就支持對(duì)微服務(wù)應(yīng)用配置信息的版本管理,并且可以通過(guò) Git 客戶端工具來(lái)方便的管理和訪問(wèn)配置內(nèi)容猛铅。當(dāng)然它也提供了對(duì)其他存儲(chǔ)方式的支持字支,比如:SVN倉(cāng)庫(kù)、本地化文件系統(tǒng)。
一個(gè)分布式配置的場(chǎng)景
場(chǎng)景描述:我們有一個(gè)服務(wù)祥款,部署在分布式的環(huán)境上清笨,服務(wù)需要訪問(wèn)數(shù)據(jù)庫(kù)。通常情況下刃跛,我們將數(shù)據(jù)庫(kù)的配置(例如數(shù)據(jù)庫(kù)地址抠艾,用戶名,密碼等等)以文件的形式放置在項(xiàng)目自身的目錄中桨昙。
這樣的問(wèn)題是检号,假如配置發(fā)生了變化(例如數(shù)據(jù)庫(kù)用戶名改變了),我們需要修改配置文件蛙酪,重新 Build齐苛,重新 Deploy。
現(xiàn)在我們嘗試將配置文件放在第三方的位置桂塞,例如 Git凹蜂。然后我們創(chuàng)建一個(gè)配置中心 config-server
,它負(fù)責(zé)去 Git 倉(cāng)庫(kù)里讀取文件內(nèi)容阁危。最后其他應(yīng)用程序玛痊,例如之前創(chuàng)建的 eureka-consumer
通過(guò)配置中心 config-server
去讀取配置。
在這里有一個(gè)問(wèn)題狂打,我們只創(chuàng)建了一個(gè)配置中心 config-server
擂煞,這樣的話,會(huì)出現(xiàn)單點(diǎn)失敗趴乡,并且負(fù)載均衡得不到保障对省。
因此我們需要?jiǎng)?chuàng)建多個(gè)配置中心,即分布式配置中心晾捏,每一個(gè) config-server
都會(huì)以服務(wù)的形式注冊(cè)到之前創(chuàng)建的服務(wù)注冊(cè)中心 eureka-server
中去蒿涎。
結(jié)構(gòu)如下:該圖引用自 https://blog.csdn.net/fox9916/article/details/79499854/
首先我們?cè)?Github 上創(chuàng)建一個(gè) repo,位置:https://github.com/chenxiangcyr/spring-cloud-config-repo-demo惦辛⊥停可以看到,包括三個(gè)不同環(huán)境的配置文件(開發(fā)裙品,測(cè)試,生產(chǎn)):
其中一個(gè)文件的內(nèi)容如下 demo-dev.properties
:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306
jdbc.username=rootDev
jdbc.password=rootDev
config-server 配置中心
通過(guò)的 Spring Assistant 插件來(lái)創(chuàng)建項(xiàng)目俗或,具體過(guò)程不再贅述市怎。
在 pom.xml
中導(dǎo)入了如下的依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
隨后在啟動(dòng)程序中通過(guò) @EnableConfigServer
來(lái)開啟 Spring Cloud Config 的服務(wù)端功能。:
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
隨后在 application.properties
中添加配置服務(wù)的基本信息以及 Git 倉(cāng)庫(kù)的相關(guān)信息辛慰。
spring.application.name=config-server
server.port=4001
# 服務(wù)注冊(cè)中心
eureka.client.serviceUrl.defaultZone=http://localhost:1234/eureka/
# Git倉(cāng)庫(kù)地址
spring.cloud.config.server.git.uri=https://github.com/chenxiangcyr/spring-cloud-config-repo-demo/
# 如果我們的Git倉(cāng)庫(kù)需要權(quán)限訪問(wèn)区匠,那么可以通過(guò)配置下面的兩個(gè)屬性來(lái)實(shí)現(xiàn)
# spring.cloud.config.server.git.username=
# spring.cloud.config.server.git.password=
# 配置文件所在的目錄
spring.cloud.config.server.git.search-paths=/**
# 配置文件所在的分支
spring.cloud.config.label=master
management.endpoints.web.exposure.include=*
最后我們分別以 4001 和 4002 兩個(gè)端口來(lái)啟動(dòng) config-server
配置中心,可以看到每一個(gè) config-server
都會(huì)以服務(wù)的形式注冊(cè)到之前創(chuàng)建的服務(wù)注冊(cè)中心 eureka-server
中去,點(diǎn)擊 http://127.0.0.1:1234/ 查看如下:
隨后我們就可以通過(guò)瀏覽器等工具直接來(lái)訪問(wèn)到我們的配置內(nèi)容了驰弄。訪問(wèn)配置信息的 URL 與配置文件的映射關(guān)系如下:
/{application}/{profile}/{label}
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
上面的 URL 會(huì)映射{application}-{profile}.properties
對(duì)應(yīng)的配置文件麻汰,其中 {label}
對(duì)應(yīng)Git上不同的分支,默認(rèn)為 master
戚篙。
例如我們通過(guò) http://127.0.0.1:4001/demo/dev/ 的形式讀取配置文件的具體內(nèi)容:
{
name: "demo",
profiles: [
"dev"
],
label: null,
version: "92f9ab1bff77011b8ab16f0d2dc7e3f24e326f6d",
state: null,
propertySources: [
{
name: "https://github.com/chenxiangcyr/spring-cloud-config-repo-demo//demo-dev.properties",
source: {
jdbc.driverClassName: "com.mysql.jdbc.Driver",
jdbc.url: "jdbc:mysql://127.0.0.1:3306",
jdbc.username: "rootDev",
jdbc.password: "rootDev"
}
}
]
}
獲取配置信息
在這里五鲫,我們利用之前創(chuàng)建的項(xiàng)目 eureka-consumer
,使得它可以通過(guò)分布式配置中心 config-server
來(lái)讀取配置岔擂。
首先在 pom.xml
中添加了如下的依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
隨后創(chuàng)建 bootstrap.properties
位喂,用來(lái)配置配置中心:
# 開啟配置服務(wù)發(fā)現(xiàn)
spring.cloud.config.enabled=true
# 配置服務(wù)實(shí)例名稱
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server
spring.cloud.config.name=demo
spring.cloud.config.profile=dev
spring.cloud.config.label=master
eureka.client.serviceUrl.defaultZone=http://localhost:1234/eureka/
注意:上面這些屬性必須配置在 bootstrap.properties
中,這樣 config-server
中的配置信息才能被正確加載乱灵。
隨后塑崖,我們創(chuàng)建一個(gè)新的 ReadConfigController
來(lái)通過(guò) @Value
注解的形式讀取配置:
@RestController
public class ReadConfigController {
private final static Logger logger = LoggerFactory.getLogger(ReadConfigController.class);
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.url}")
String url;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@GetMapping("/config")
public String config() {
logger.info("jdbc.driverClassName = " + driverClassName);
logger.info("jdbc.url = " + url);
logger.info("jdbc.username = " + username);
logger.info("jdbc.password = " + password);
return "success";
}
}
最后,重啟 eureka-consumer
痛倚,訪問(wèn)新創(chuàng)建的 Rest 接口 http://127.0.0.1:3001/config规婆,可以在日志中看到,配置被成功讀炔跷取:
推送通知和 Spring Cloud Bus
在上面的示例中抒蚜,有一個(gè)問(wèn)題:我們通過(guò) Git 修改來(lái) demo-dev.properties
文件中的內(nèi)容,但是更新后的內(nèi)容并沒(méi)有被 eureka-consumer
獲取到颠区。
現(xiàn)在我們來(lái)解決這個(gè)問(wèn)題:
許多源代碼存儲(chǔ)庫(kù)提供程序(例如Github削锰,Gitlab 或 Bitbucket)將通過(guò) Webhook 通知您存儲(chǔ)庫(kù)中的更改。
可以通過(guò)提供商的用戶界面將 Webhook 配置為 URL 和一組感興趣的事件毕莱,例如:
流程如下圖所示:引用自 https://blog.csdn.net/mazhen1991/article/details/78513452
對(duì)于配置中心 config-server
器贩,需要進(jìn)行如下修改
添加如下的依賴到 pom.xml
中:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
</dependency>
安裝并啟動(dòng)一個(gè) RabbitMQ 實(shí)例,并在 application.properties
中配置 RabbitMQ 連接信息:
spring.rabbitmq.host=127.0.0.1
對(duì)于 eureka-consumer
朋截,需要進(jìn)行如下修改
添加如下的依賴到 pom.xml
中:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
在 application.properties
中配置 RabbitMQ 連接信息:
spring.rabbitmq.host=127.0.0.1
拓展閱讀
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):分布式配置中心(加密與解密)
- Spring Cloud構(gòu)建微服務(wù)架構(gòu):分布式配置中心(高可用與動(dòng)態(tài)刷新)
引用:
程序猿DD Spring Cloud基礎(chǔ)教程
Spring Cloud構(gòu)建微服務(wù)架構(gòu):分布式配置中心【Dalston版】
Spring Cloud Dalston中文文檔