Spring?Cloud?Config簡(jiǎn)介在傳統(tǒng)的單體式應(yīng)用系統(tǒng)中,我們通常會(huì)將配置文件和代碼放在一起,但隨著系統(tǒng)越來(lái)越大,需要實(shí)現(xiàn)的功能越來(lái)越多時(shí),我們又不得不將系統(tǒng)升級(jí)為分布式系統(tǒng),同時(shí)也會(huì)將系統(tǒng)的功能進(jìn)行更加細(xì)化的拆分。拆分后,所有的服務(wù)應(yīng)用都會(huì)有自己的配置文件,當(dāng)需要修改某個(gè)服務(wù)的配置時(shí),我們可能需要修改很多處,并且為了某一項(xiàng)配置的修改,可能需要重啟這個(gè)服務(wù)相關(guān)的所有服務(wù),這顯然是非常麻煩的。在傳統(tǒng)的單體式應(yīng)用系統(tǒng)中,我們通常會(huì)將配置文件和代碼放在一起,但隨著系統(tǒng)越來(lái)越大,需要實(shí)現(xiàn)的功能越來(lái)越多時(shí),我們又不得不將系統(tǒng)升級(jí)為分布式系統(tǒng),同時(shí)也會(huì)將系統(tǒng)的功能進(jìn)行更加細(xì)化的拆分。拆分后,所有的服務(wù)應(yīng)用都會(huì)有自己的配置文件,當(dāng)需要修改某個(gè)服務(wù)的配置時(shí),我們可能需要修改很多處,并且為了某一項(xiàng)配置的修改,可能需要重啟這個(gè)服務(wù)相關(guān)的所有服務(wù),這顯然是非常麻煩的。 Spring?Cloud?Config是Spring?Cloud團(tuán)隊(duì)創(chuàng)建的一個(gè)全新的項(xiàng)目,該項(xiàng)目主要用來(lái)為分布式系統(tǒng)中的外部配置提供服務(wù)器(Config?Server)和客戶端(Config?Client)支持。 ·服務(wù)器端(Config?Server):也被稱之為分布式配置中心,它是一個(gè)獨(dú)立的微服務(wù)應(yīng)用,主要用于集中管理應(yīng)用程序各個(gè)環(huán)境下的配置,默認(rèn)使用Git存儲(chǔ)配置文件內(nèi)容,也可以使用SVN存儲(chǔ),或者是本地文件存儲(chǔ)。 ·客戶端(Config?Client):是Config?Server的客戶端,即微服務(wù)架構(gòu)中的各個(gè)微服務(wù)應(yīng)用。它們通過(guò)指定的配置中心(Config?Server)來(lái)管理應(yīng)用資源以及與業(yè)務(wù)相關(guān)的配置內(nèi)容,并在啟動(dòng)時(shí)從配置中心獲取和加載配置信息。 Spring?Cloud?Config的工作流程如圖5-17所示。
? ![]() 在圖5-17中,用戶會(huì)先將配置文件推送到Git或SVN中,然后在微服務(wù)應(yīng)用(Config?Client)啟動(dòng)時(shí),會(huì)從配置中心(Config?Server)中獲取配置信息,而配置中心會(huì)根據(jù)配置從Git或SVN中獲取相應(yīng)的配置信息。 使用本地存儲(chǔ)的方式實(shí)現(xiàn)配置管理通過(guò)上一小節(jié)的學(xué)習(xí),我們已經(jīng)知道Spring?Cloud?Config支持本地、Git和SVN的存儲(chǔ)方式。接下來(lái)本小節(jié)將以本地存儲(chǔ)方式為例,講解Spring?Cloud?Config的使用。1.?搭建Config?Server (1)創(chuàng)建配置中心工程microservice-config-server,并在其pom.xml中引入Config?Server的依賴,如文件5-12所示。 文件5-12 pom.xml <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance"
xsi:schemaLocation="http://maven./POM/4.0.0 http://maven./xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xc</groupId>
<artifactId>xcservice-springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.xc</groupId>
<artifactId>xcservice-config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>xcservice-config-server</name>
<description>配置管理</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency><!--Config Server的依賴-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
? (2)編寫配置文件application.yml,添加服務(wù)端口號(hào)和存儲(chǔ)屬性等信息,如文件5-13所示。文件5-13 application.yml server:
port: 8888
spring:
application:
name: xcservice-config-server # 指定應(yīng)用名稱
profiles:
active: native # 使用本地文件系統(tǒng)的存儲(chǔ)方式來(lái)保存配置信息
? ?。?)在src/main/resources目錄下創(chuàng)建3個(gè)分別用于表示開(kāi)發(fā)、預(yù)發(fā)布和測(cè)試的資源配置文件,并在文件中編寫如下內(nèi)容。·application-dev.yml中編寫內(nèi)容:clientParam:native-dev-1.0 ·application-prod.yml中編寫內(nèi)容:clientParam:native-prod-1.0 ·application-test.yml中編寫內(nèi)容:clientParam:native-test-1.0 上述資源文件是按照“應(yīng)用名 環(huán)境名 格式”的規(guī)范來(lái)命名的,其常見(jiàn)文件的命名方式如下: /{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中application表示的是應(yīng)用名稱,profile表示變化的文件,而label是可選的,表示Git的分支,默認(rèn)是master。 ?。?)創(chuàng)建啟動(dòng)類,并在類上增加@EnableConfigServer注解以開(kāi)啟服務(wù)端功能,如文件5-14所示。 文件5-14 Application.java package com.xc.xcserviceconfigserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
/**
* http://localhost:8888/microservice-config-server/dev
* http://localhost:8888/application-dev.yml
*/
@EnableConfigServer
@SpringBootApplication
public class XcserviceConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(XcserviceConfigServerApplication.class, args);
}
}
? ?。?)啟動(dòng)工程,測(cè)試應(yīng)用。應(yīng)用啟動(dòng)成功后,按照如下格式的URL發(fā)起請(qǐng)求:http://localhost:8888/{applicationname}/{env}/{label}本應(yīng)用中的訪問(wèn)地址為http://localhost:8888/microservice-config-server/dev,瀏覽器中的JSON信息顯示出了應(yīng)用名microservice-config-server、環(huán)境名dev,以及資源文件路徑和文件內(nèi)容等信息。 除此之外,我們也可以直接訪問(wèn)資源文件,來(lái)查看資源文件內(nèi)的配置信息。通過(guò)瀏覽器訪問(wèn)地址http://localhost:8888/ap-plication-dev.yml 2.?搭建Config?Client ?。?)創(chuàng)建客戶端工程microservice-config-client,并在其pom.xml中添加Config和Web的依賴,如文件5-15所示。 文件5-15 pom.xml <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance"
xsi:schemaLocation="http://maven./POM/4.0.0 http://maven./xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xc</groupId>
<artifactId>xcservice-springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.xc</groupId>
<artifactId>xcservice-config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>xcservice-config-client</name>
<description>Config Client</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
? ?。?)編寫配置文件bootstrap.yml,在其中配置應(yīng)用名稱、服務(wù)中心地址、需要訪問(wèn)的文件和端口號(hào)等信息,如文件5-16所示。文件5-16 bootstrap.yml server:
port: 8801
spring:
application:
name: xcservice-config-client
cloud:
config:
profile: test # 配置服務(wù)中的{profile}
uri: http://localhost:8888/ # 配置中心的地址
需要注意的是,上述配置文件的名稱必須為bootstrap.yml或bootstrap.properties,只有這樣配置中心才能夠正常加載(雖然application.yml也可以被Spring?Boot加載,但是boot-strap.yml會(huì)優(yōu)先加載)。 (3)創(chuàng)建啟動(dòng)類,并在類上添加@RestController注解,編輯后如文件5-17所示。文件5-17 Application.java package com.xc.xcserviceconfigclient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* http://localhost:8801/client-Param
*/
@SpringBootApplication
@RestController
public class XcserviceConfigClientApplication {
@Value("${clientParam}")
private String clientParam;
@RequestMapping("/clientParam")
public String getParam() {
return this.clientParam;
}
/**
* http://localhost:8801/hello
*
* @return
*/
@RequestMapping("/hello")
public String hello() {
return "hello world";
}
public static void main(String[] args) {
SpringApplication.run(XcserviceConfigClientApplication.class, args);
}
}
? ?。?)啟動(dòng)工程,測(cè)試應(yīng)用。應(yīng)用啟動(dòng)成功后,可以通過(guò)地址http://localhost:8801/hello測(cè)試應(yīng)用是否能夠正常訪問(wèn)此時(shí)通過(guò)瀏覽器訪問(wèn)地址http://localhost:8801/clientParam,即可獲取配置文件中的信息 當(dāng)我們需要訪問(wèn)其他配置文件的信息時(shí),只需修改bootstrap.yml中的profile的屬性值即可。 使用Git存儲(chǔ)的方式實(shí)現(xiàn)配置管理Spring?Cloud?Config的服務(wù)端默認(rèn)采用的是Git配置倉(cāng)庫(kù),通過(guò)Git可以非常方便地使用各種第三方工具來(lái)對(duì)其內(nèi)容進(jìn)行更新管理和版本控制,并且Git倉(cāng)庫(kù)的Webhooks功能還可以實(shí)時(shí)地監(jiān)控配置內(nèi)容的修改,所以使用Git存儲(chǔ)的方式是十分方便的。掌握了本地存儲(chǔ)方式的使用后,Git存儲(chǔ)方式的使用就很容易掌握了。下面我們同樣以上一小節(jié)的案例為例,來(lái)講解如何通過(guò)Spring?Cloud?Config的客戶端從服務(wù)端獲取Git倉(cāng)庫(kù)中不同版本配置信息。 ?。?)配置Git。在Git上創(chuàng)建xcservice-study-config目錄,并在目錄中增加開(kāi)發(fā)、預(yù)發(fā)布和測(cè)試的配置文件,分別編輯三個(gè)文件中的內(nèi)容如下: ·application-dev.yml中編寫內(nèi)容:clientParam:git-dev-1.0 ·application-prod.yml中編寫內(nèi)容:clientParam:git-prod-1.0 ·application-test.yml中編寫內(nèi)容:clientParam:git-test-1.0 ?。?)修改服務(wù)端配置文件。將xcservice-config-server工程的配置文件中本地文件存儲(chǔ)方式的配置刪除(或注釋),并添加git的配置信息,如文件5-18所示。 文件5-18 application.yml server:
port: 8888
spring:
application:
name: xcservice-config-server # 指定應(yīng)用名稱
#profiles:
# active: native # 使用本地文件系統(tǒng)的存儲(chǔ)方式來(lái)保存配置信息
cloud:
config:
server:
git: # 使用git的方式
uri: https:///secret8/microservice-study-config.git
? 在上述配置中,spring.cloud.config.server.git.uri屬性用來(lái)指定Git倉(cāng)庫(kù)的網(wǎng)絡(luò)地址。由于這里配置的是公共倉(cāng)庫(kù),所以不需要填寫用戶名和密碼信息。如果是私有倉(cāng)庫(kù),則需要填寫賬號(hào)信息,此時(shí)可以在git屬性下增加username和password屬性。?。?)修改客戶端配置文件。在xcservice-config-client工程的配置文件中添加屬性label,并將其屬性值設(shè)置為mas-ter(label屬性表示Git中的分支,其屬性默認(rèn)值為master),編輯后如文件5-19所示。 文件5-19 bootstrap.yml server:
port: 8801
spring:
application:
name: xcservice-config-client
cloud:
config:
profile: test # 配置服務(wù)中的{profile}
label: master # 對(duì)應(yīng)git中的分支,默認(rèn)為master
uri: http://localhost:8888/ # 配置中心的地址的地址
? ?。?)啟動(dòng)工程,測(cè)試應(yīng)用。分別啟動(dòng)Spring?Cloud?Config的服務(wù)端和客戶端工程,通過(guò)訪問(wèn)地址http://localhost:8801/clientParam,發(fā)現(xiàn)已經(jīng)可以獲取Git中的配置信息了手動(dòng)更新運(yùn)行中的配置文件在實(shí)際項(xiàng)目應(yīng)用中,我們可能需要對(duì)配置文件的內(nèi)容做一些修改,而要想使修改的配置文件生效,通常做法是將應(yīng)用重啟。此種方式對(duì)于小型應(yīng)用,以及使用人數(shù)不多的應(yīng)用來(lái)說(shuō)比較適用,但是對(duì)于大型企業(yè)和互聯(lián)網(wǎng)應(yīng)用來(lái)說(shuō),重啟應(yīng)用是行不通的。這也就要求運(yùn)維人員在修改完應(yīng)用的配置后,要保證配置及時(shí)生效。Spring?Cloud?Config正好提供了這種功能,我們可以在客戶端用POST請(qǐng)求refresh方法來(lái)刷新配置內(nèi)容。以上一小節(jié)的案例為例,要實(shí)現(xiàn)配置文件的實(shí)時(shí)更新,需要執(zhí)行以下幾步。 ?。?)在客戶端的pom.xml中添加依賴spring-boot-starter-actuator。該依賴可以監(jiān)控程序在運(yùn)行時(shí)的狀態(tài),其中包括/refresh的功能。pom.xml中添加的依賴信息如下: <dependency><!--監(jiān)控程序在運(yùn)行時(shí)的狀態(tài)-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
? ?。?)在啟動(dòng)類上添加@RefreshScope注解,開(kāi)啟refresh機(jī)制。添加此注解后,在執(zhí)行/refresh時(shí)會(huì)更新該注解標(biāo)注類下的所有變量值,包括Config?Client從Git倉(cāng)庫(kù)中所獲取的配置。?。?)在配置文件中將安全認(rèn)證信息的enabled屬性設(shè)置為false,其代碼如下: management:
security:
enabled: false # 是否開(kāi)啟actuator安全認(rèn)證
? 執(zhí)行完上述3步后,下面來(lái)檢測(cè)應(yīng)用是否可以實(shí)現(xiàn)更新運(yùn)行中的配置文件。啟動(dòng)應(yīng)用并訪問(wèn)http://localhost:8801/clientParam此時(shí)修改Git中的配置文件application-prod.yml,將其內(nèi)容clientParam:git-prod-1.0,修改為clientParam:git-prod-2.0后,再次通過(guò)瀏覽器訪問(wèn)上述地址,會(huì)發(fā)現(xiàn)瀏覽器的內(nèi)容并沒(méi)有變化,但通過(guò)地址 http://localhost:8888/application/prod訪問(wèn)時(shí),會(huì)發(fā)現(xiàn)服務(wù)器端已經(jīng)獲取到了Git中的更新配置信息 使用POST請(qǐng)求訪問(wèn)地址http://localhost:8801/refresh后,此時(shí)再次通過(guò)瀏覽器訪問(wèn)http://localhost:8801/clientParam時(shí),瀏覽器中已成功顯示了更新后的配置文件內(nèi)容,這也就說(shuō)明我們已成功實(shí)現(xiàn)了手動(dòng)更新運(yùn)行中的配置文件。? ?來(lái)源:https://www./content-4-337051.html |
|
|
來(lái)自: 印度阿三17 > 《開(kāi)發(fā)》