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