案例代碼: https://github.com/q279583842q/springcloud-e-book
本文我們來讨論下如何在配置中心的資訊被改變的情況下,及時重新整理用戶端的資料的情況。
一、配置中心原理
1.原理結構圖

2.原理描述
通過上圖我們能看到配置服務其實是從本地的Git倉庫中擷取的資訊,Git本地庫通過pull指令同步遠端庫中的内容。當配置中心用戶端重新啟動的時候會顯示的執行pull指令來拉取最新的配置資訊,這個我們可以通過如下案例來得到示範.
2.1 關閉配置中心用戶端
關閉配置中心用戶端服務。
2.2 顯示修改git中内容
直接在碼雲倉庫中修改内容
2.3 啟動用戶端服務
啟動用戶端,觀察控制台資訊,通路擷取配置資訊
擷取的是修改後的資料,說明啟動用戶端服務可以同步重新整理配置資訊。但是總歸要重新開機服務,不是太友善,是以我們來考慮不重新開機服務來同步配置資訊
二、動态重新整理配置資訊
此處我們可以使用actuator監控服務中的refuse指令來重新整理服務。是以我們需要建立一個新的包含Actuator服務的配置中心用戶端。
1.建立項目
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<groupId>com.bobo</groupId>
<artifactId>config-client-refresh</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.修改配置
spring.application.name=config-client-refresh
server.port=9051
#設定服務注冊中心位址,指向另一個注冊中心
eureka.client.serviceUrl.defaultZone=http://dpb:123456@eureka1:8761/eureka/,http://dpb:123456@eureka2:8761/eureka/
#預設 false,這裡設定 true,表示開啟讀取配置中心的配置
spring.cloud.config
.discovery.enabled=true
#對應 eureka 中的配置中心 serviceId,預設是 configserver
spring.cloud.config.discovery.serviceId=config-server
#指定環境
spring.cloud.config.profile=dev
#git 标簽
spring.cloud.config.label=master
#springboot 預設開啟了權限攔截 會導緻 /refresh 出現 401,拒絕通路
management.security.enabled=false
同時我們需要在碼雲中建立一個新的配置檔案
4.重新整理請求
因為refresh指令隻支援post方式送出,是以我們不能直接在浏覽器中通路。
現在擷取資訊
5.修改bean對象的作用域
在spring中bean對象預設是單例模式,是以即便項目被重新整理了,成員變量的值也不會改變,是以我們需要改變了bean對象的作用域
@RestController
@RefreshScope //重新整理作用域
public class ShowController {
@Value("${e-book}")
private String msg;
@RequestMapping("/showMsg")
public String showMsg(){
return msg;
}
}
6.通過RestTemplate發送post請求
/**
* 通過RestTemplate發送post請求來重新整理
* @param args
*/
public static void main(String[] args) {
RestTemplate template = new RestTemplate();
String url = "http://localhost:9051/refresh";
template.postForLocation(url, null);
System.out.println("----");
}
7.測試
在服務都在運作的情況下,修改碼雲中的配置資料
通路資料為
然後執行RestTemplate的post方式通路
如此實作了在沒有重新啟動服務的情況下動态同步的配置資訊~