SpringCloud配置中心Config
1.Spring Cloud Config 介紹
提供了一種在分散式系統中外部化配置伺服器和客戶端的支
持。配置伺服器有一箇中心位置,管理所有環境下的應用的外部屬性。客戶端和服
務器對映到相同Spring Eventment 和 PropertySrouce抽象的概念,所以非常適合
Spring應用,但也可以在任何語言開發的任何應用中使用。在一個應用從開發、測
試到生產的過程中,你可以分別地管理開發、測試、生產環境的配置,並且在遷移
的時候獲取相應的配置來執行。
Config Server 儲存後端預設使用git儲存配置資訊,因此可以很容易支援標記配置
環境的版本,同時可以使用一個使用廣泛的工具管理配置內容。當然新增其他方式
的儲存實現也是很容易的。
參考:
http://cloud.spring.io/spring-cloud-static/Brixton.SR5/#_spring_cloud_config
核心程式碼:
org.springframework.cloud.config.server.environment.NativeEnvir
onmentRepository ,留意其中的 findOne 方法。
準備工作
為了更貼近生產,我們首先配置Host
127.0.0.1 config-server
- 準備幾個配置檔案,命名規範為 專案名稱-環境名稱.properties ,本文在git
倉庫:https://github.com/eacdy/spring-cloud-study/中,新建目錄configrepo,
建立以下幾個檔案:
microservice-config-client-dev.properties
microservice-config-client.properties
其中在: microservice-config-client-dev.properties 檔案中新增如下內容:
profile=dev
伺服器端程式碼示例
建立一個Maven專案,在pom.xml檔案中新增如下內容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht
tp://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://m
aven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>microservice-config-server</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.itmuch.cloud</groupId>
<artifactId>spring-cloud-microservice-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
</project>
- 啟動類:
/**
* 通過@EnableConfigServer註解啟用配置服務.
* 說明:
* 在application.yml中有個git.uri的配置,目前配置的是https://github.c
om/eacdy/spring-cloud-study/
* 獲取git上的資源資訊遵循如下規則:
* /{application}/{profile}[/{label}]
* /{application}-{profile}.yml
* /{label}/{application}-{profile}.yml
* /{application}-{profile}.properties
* /{label}/{application}-{profile}.properties
*
* 例如本例:可使用以下路徑來訪問microservice-config-client-dev.prope
rties:
* http://localhost:8040/microservice-config-client-dev.properti
es
* http://localhost:8040/microservice-config-client/dev
* ...
* @author eacdy
*/
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
- 配置檔案:application.yml
server:
port: 8040
spring:
application:
name: microservice-config-server
cloud:
config:
server:
git:
uri: https://github.com/eacdy/spring-cloud-study/
# 配置git倉庫的地址
search-paths: config-repo
# git倉庫地址下的相對地址,可以配置多個,用,分割。
username:
# git倉庫的賬號
password:
# git倉庫的密碼
這樣,一個Config Server就完成了。
例如本例:可使用以下路徑來訪問 microservice-config-clientdev.
properties :
http://localhost:8040/microservice-config-client-dev.properties
http://localhost:8040/microservice-config-client/dev
按照上文,我們成功搭建了Config Server,並測試能夠正常獲取到git倉庫中的配置
資訊。那麼對於一個微服務應用,如何才能獲取配置資訊呢?
配置服務客戶端示例
新建一個Maven專案,在pom.xml中新增如下內容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht
tp://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://m
aven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>microservice-config-client</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.itmuch.cloud</groupId>
<artifactId>spring-cloud-microservice-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
- 編寫啟動類:
@SpringBootApplication
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
- 編寫測試Controller
/**
* 這邊的@RefreshScope註解不能少,否則即使呼叫/refresh,配置也不會重新整理
* @author eacdy
*/
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${profile}")
private String profile;
@GetMapping("/hello")
public String hello() {
return this.profile;
}
}
- 配置檔案:application.yml
server:
port: 8041
配置檔案bootstrap.yml(為什麼要使用bootstrap.yml而不直接放在
application.yml中的原因見注意點)
spring:
application:
name: microservice-config-client # 對應microservice-config-server所獲取的配置檔案的{application}
cloud:
config:
uri: http://config-server:8040/
profile: dev # 指定profile,對應microservice-config-server所獲取的配置檔案中的{profile}
label: master # 指定git倉庫的分支,對應microservice-config-server所獲取的配置檔案的{label}
啟動,並訪問:
http://localhost:8041/hello ,我們會發現此時可以顯示git倉庫中配置檔案的內容:
dev
配置內容的熱載入
如果不重啟應用,能夠做到配置的重新整理嗎?答案顯然是可以的。
我們將microservice-config-client-dev.properties中值改為
profile=abcd
並提交到git倉庫。
然後使用命令(本文使用的是curl,Linux和Windows都有curl工具,當然也可以借
助其他工具,例如Postman等):
curl -X POST http://localhost:8041/refresh
然後再次訪問http://localhost:8041/hello ,將會看到: abcd ,說明配置已經刷
新。