Spring Cloud Config配置中心是什么
在分布式系統(tǒng)中,尤其是當(dāng)我們的分布式項(xiàng)目越來(lái)越多,每個(gè)項(xiàng)目都有自己的配置文件,對(duì)配置文件的統(tǒng)一管理就成了一種需要,而 Spring Cloud Config 就提供了對(duì)各個(gè)分布式項(xiàng)目配置文件的統(tǒng)一管理支持。Spring Cloud Config 也叫分布式配置中心,市面上開(kāi)源的分布式配置中心有很多,比如國(guó)內(nèi)的, 360 的QConf、淘寶的 diamond、百度的 disconf 都是解決分布式系統(tǒng)配置管理問(wèn)題,國(guó)外也有很多開(kāi)源的配置中心 Apache 的 Apache Commons Configuration、owner、cfg4j 等等;
Spring Cloud Config 是一個(gè)解決分布式系統(tǒng)的配置管理方案。它包含 Client和 Server 兩個(gè)部分,Server 提供配置文件的存儲(chǔ)、以接口的形式將配置文件的內(nèi)容提供出去,Client 通過(guò)接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用。
Spring cloud 使用 git 或 svn 存放配置文件,默認(rèn)情況下使用 git。
構(gòu)建一個(gè) spring cloud config 配置中心按照如下方式進(jìn)行:
1、創(chuàng)建一個(gè)普通的 Spring Boot 項(xiàng)目
2、在 pom.xml 文件中添加如下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
3、在入口類,也就是 main 方法的類上添加注解 @EnableConfigServer
4、在 application.properties 中配置一下 git 倉(cāng)庫(kù)信息,此處我們使用 GitHub( 也可以使用碼云 gitee ) , 首先在我的 Github 上創(chuàng)建一個(gè)名為spring-cloud-config 的項(xiàng)目,創(chuàng)建之后,再做如下配置:
server.port=3721
spring.application.name=07-springcloud-config-server
spring.cloud.config.server.git.uri=https://github.com/myspring/sprin
g-cloud-config.git
spring.cloud.config.server.git.search-paths=config-center
spring.cloud.config.server.git.username=xxxx@163.com
spring.cloud.config.server.git.password=xxxx123456
其中:
● uri 表示配置中心所在倉(cāng)庫(kù)的位置
● search-paths 表示倉(cāng)庫(kù)下的子目錄
● username 表示你的 GitHub 用戶名
● password 表示你的 GitHub 密碼
至此我們的配置中心服務(wù)端就創(chuàng)建好了。
接下來(lái)我們需要在 github 上設(shè)置好配置中心,首先在本地創(chuàng)建一個(gè)文件夾叫wkcto,然后在里面創(chuàng)建一個(gè)文件夾叫 config-center,然后在 config-center中創(chuàng)建四個(gè)配置文件,如下:
application.properties
application-dev.properties
application-test.properties
application-online.properties
在四個(gè)文件里面分別寫(xiě)上要測(cè)試的內(nèi)容:
url=http://www.wkcto.com
url=http://dev.wkcto.com
url=http://test.wkcto.com
url=http://online.wkcto.com
然后回到 wkcto 目錄下,依次執(zhí)行如下命令將本地文件同步到 Github 倉(cāng)庫(kù)中:
說(shuō)明:在使用命令之前先從 https://git-scm.com/ 網(wǎng)站下載安裝 git 的 window 客戶端
1、添加提交人的賬號(hào)信息,git 需要知道提交人的信息作為標(biāo)識(shí);
git config --global user.name 'junge'
git config --global user.email 'junge@163.com'
2、將該目錄變?yōu)?git 可以管理的目錄;
git init
3、將文件添加到暫存區(qū)
git add config-center/
4、把文件提交到本地倉(cāng)庫(kù);
git commit -m 'add config-center'
5、添加遠(yuǎn)程主機(jī);
git remote add origin https://github.com/hnylj/spring-cloud-config.git
6、將本地的 master 分支推送到 origin 主機(jī);
git push -u origin master
至此,我們的配置文件就上傳到 GitHub 上了。
此時(shí)啟動(dòng)我們的配置中心,通過(guò)/{application}/{profile}/{label}就能訪問(wèn)到我們的配置文件了;
其中:
{application}表示配置文件的名字,對(duì)應(yīng)的配置文件即application,
{profile}表示環(huán)境,有dev、test、online及默認(rèn),
{label}
通過(guò)瀏覽器上訪問(wèn) http://localhost:3721/application/dev/master
返回的 JSON 格式的數(shù)據(jù):
name 表示配置文件名 application 部分,profiles 表示環(huán)境部分,label 表示分支,version 表示 GitHub 上提交時(shí)產(chǎn)生的版本號(hào),同時(shí)當(dāng)我們?cè)L問(wèn)成功后,在控制臺(tái)會(huì)打印了相關(guān)的日志信息;當(dāng)訪問(wèn)成功后配置中心會(huì)通過(guò) git clone 命令將遠(yuǎn)程配置文件在本地也保存一份,以確保在 git 倉(cāng)庫(kù)故障時(shí)我們的應(yīng)用還可以繼續(xù)正常使用。
前面已經(jīng)搭建好了配置中心的服務(wù)端,接下來(lái)我們來(lái)看看如何在客戶端應(yīng)用中使用。
1、創(chuàng)建一個(gè)普通的 Spring Boot 工程 08-springcloud-config-client,并添加如下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2、創(chuàng)建 bootstrap.properties 文件,用于獲取配置信息,文件內(nèi)容如下:
(注意這些信息一定要放在 bootstrap.properties 文件中才有效)
server.port=3722
spring.application.name=application
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:3721/
其中:
name 對(duì)應(yīng)配置文件中的 application 部分,profile 對(duì)應(yīng)了 profile 部分,label 對(duì)應(yīng)了 label 部分,uri 表示配置中心的地址。
3、創(chuàng)建一個(gè) Controller 進(jìn)行測(cè)試:
@RestController
@RefreshScope
public class ConfigController {
@Value("${url}")
http://www.wkcto.com
private String url;
@Autowired
private Environment env;
@RequestMapping("/cloud/url")
public String url () {
return this.url;
}
@RequestMapping("/cloud/url2")
public String url2 () {
return env.getProperty("url");
}
}
我們可以直接使用@Value 注解注入配置的屬性值,也可以通過(guò) Environment對(duì)象來(lái)獲取配置的屬性值。
通過(guò)客戶端應(yīng)用測(cè)試是否能夠獲取到配置中心配置的數(shù)據(jù);
Spring cloud Config Server 的工作過(guò)程如下圖所示:
1、首先需要一個(gè)遠(yuǎn)程 Git 倉(cāng)庫(kù),平時(shí)測(cè)試可以使用 GitHub,在實(shí)際生產(chǎn)環(huán)境中,需要自己搭建一個(gè) Git 服務(wù)器,遠(yuǎn)程 Git 倉(cāng)庫(kù)的主要作用是用來(lái)保存我們的配置文件;
2、除了遠(yuǎn)程 Git 倉(cāng)庫(kù)之外,我們還需要一個(gè)本地 Git 倉(cāng)庫(kù),每當(dāng) Config Server訪問(wèn)遠(yuǎn)程 Git 倉(cāng)庫(kù)時(shí),都會(huì)克隆一份到本地,這樣當(dāng)遠(yuǎn)程倉(cāng)庫(kù)無(wú)法連接時(shí),就直接使用本地存儲(chǔ)的配置信息;
3、微服務(wù) A、微服務(wù) B 則是我們的具體應(yīng)用,這些應(yīng)用在啟動(dòng)的時(shí)會(huì)從 ConfigServer 中獲取相應(yīng)的配置信息;
4.當(dāng)微服務(wù) A、微服務(wù) B 嘗試從 Config Server 中加載配置信息的時(shí)候,ConfigServer 會(huì)先通過(guò) git clone 命令克隆一份配置文件保存到本地;
5、由于配置文件是存儲(chǔ)在 Git 倉(cāng)庫(kù)中,所以配置文件天然具有版本管理功能;
生產(chǎn)環(huán)境中我們的配置中心肯定是不能隨隨便便被人訪問(wèn)的,我們可以加上適當(dāng)?shù)谋Wo(hù)機(jī)制,由于微服務(wù)是構(gòu)建在 Spring Boot 之上,所以整合 Spring Security是最方便的方式。
1、在 springcloud config server 項(xiàng)目添加依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、在 springcloud config server 項(xiàng)目的 application.properties 中配置用戶名密碼:
spring.security.user.name=wkcto
spring.security.user.password=123456
3、在 springcloud config client 上 bootstrap.properties 配置用戶名和密碼:
spring.cloud.config.username=wkcto
spring.cloud.config.password=123456
4、最后測(cè)試驗(yàn)證;