對於配置的重要性,我想我不用進行任何強調,你們均可以明白其重要性。在普通單體應用,咱們常使用配置文件(application(*).properties(yml))管理應用的全部配置。這些配置文件在單體應用中很是勝任其角色,並無讓咱們感受到有頭疼的地方。但隨着微服務框架的引入,微服務數量就會在咱們產品中不斷增長,以前咱們重點考慮的是系統的可伸縮、可擴展性好,但隨之就是配置管理的問題就會一一暴露出來。起初微服務器各自管各自的配置,在開發階段並沒什麼問題,但到了生產環境管理就會很頭疼,若是要大規模更新某項配置,困難就可想而知。java
爲此,在分佈式系統中,Spring Cloud提供一個Config子項目,該項目核心就是配置中心,經過一個服務端和多個客戶端實現配置服務。咱們可以使用配置服務器集中的管理全部服務的各類環境配置文件。配置服務中心默認採用Git的方式進行存儲,所以咱們很容易部署修改,並能夠對環境配置進行版本管理。git
Spring Cloud Config具備中心化、版本控制、支持動態更新和語言獨立等特性。其特色是:web
Spring Cloud Config的結構圖以下:spring
從圖中能夠看出Spring Cloud Config有兩個角色(相似Eureka): Server和Client。Spring Cloud Config Server做爲配置中心的服務端承擔以下做用:json
而對於,Spring Cloud Config Client則很是方便,只須要在啓動配置文件中增長使用Config Server上哪一個配置文件便可。bootstrap
pom以下服務器
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency>
啓動類app
@SpringBootApplication @EnableConfigServer public class SpringCloundConfigDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringCloundConfigDemoApplication.class, args); } }
其中增長了@EnableConfigServer框架
application.properties分佈式
server.port=8890 spring.application.name=server-config spring.cloud.config.server.git.uri=https://gitee.com/skyLogin/SpringCloundConfigGit.git spring.cloud.config.server.git.username=登陸名 spring.cloud.config.server.git.password=密碼
這裏最重要的是須要配置Git倉庫的地址及登陸用戶名和口令。
project.name = sky
user-dev.properties
project.description = dev-description
{ "name": "user", "profiles": ["dev"], "label": null, "version": "9bc698347dcb4e82e1c8fc631d7409cc3f0e6a65", "state": null, "propertySources": [{ "name": "https://gitee.com/skyLogin/SpringCloundConfigGit.git/user-dev.properties", "source": { "project.description": "dev-description" } }, { "name": "https://gitee.com/skyLogin/SpringCloundConfigGit.git/user.properties", "source": { "project.name": "sky" } }] }
這裏能夠看到,咱們提交到Git中的配置文件已經可以被server-config正確的讀取到。
config-client能夠是任何一個基於Spring boot的應用,這裏爲了講解方便,咱們構建一個很是簡單的web工程。
咱們的config-client
項目須要引入對spring-cloud-starter-config
的依賴,以下:
pom
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
一個標準的Spring Boot啓動類:
@SpringBootApplication public class SpringCloundConfigClientDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringCloundConfigClientDemoApplication.class, args); } }
這個測試Controller主要就是驗證咱們能夠從Git倉庫中獲取配置內容。
@RestController public class ConfigController { @Value("${project.name}") String name; @Value("${project.description}") String description; @RequestMapping("/config/get/message") public String getMessage() { return name + " - " + description; } }
這裏編寫的配置文件名稱爲:bootstrap.properties
,內容以下:
server.port=8891 spring.application.name=user spring.cloud.config.profile=dev spring.cloud.config.uri= http://localhost:8890/
定義了微服務的名稱和profile以及配置服務器的地址。
注意: 這些配置不可以配置在
application.properties
文件中,由於在Spring Boot啓動時有引導上下文和應用上下文的概念,只有將配置服務器信息定義在引導上下文中,纔可以從配置服務器中獲取到配置信息。不然,服務啓動時會報找不到變量定義的錯誤。
說明,咱們的config-client已經成功從server-config上獲取到配置的數據了。