天天看點

SpringCloud-分布式配置中心【動态重新整理】

案例代碼: https://github.com/q279583842q/springcloud-e-book

 本文我們來讨論下如何在配置中心的資訊被改變的情況下,及時重新整理用戶端的資料的情況。

一、配置中心原理

1.原理結構圖

SpringCloud-分布式配置中心【動态重新整理】

2.原理描述

 通過上圖我們能看到配置服務其實是從本地的Git倉庫中擷取的資訊,Git本地庫通過pull指令同步遠端庫中的内容。當配置中心用戶端重新啟動的時候會顯示的執行pull指令來拉取最新的配置資訊,這個我們可以通過如下案例來得到示範.

2.1 關閉配置中心用戶端

 關閉配置中心用戶端服務。

2.2 顯示修改git中内容

 直接在碼雲倉庫中修改内容

SpringCloud-分布式配置中心【動态重新整理】

2.3 啟動用戶端服務

 啟動用戶端,觀察控制台資訊,通路擷取配置資訊

SpringCloud-分布式配置中心【動态重新整理】

擷取的是修改後的資料,說明啟動用戶端服務可以同步重新整理配置資訊。但是總歸要重新開機服務,不是太友善,是以我們來考慮不重新開機服務來同步配置資訊

二、動态重新整理配置資訊

 此處我們可以使用actuator監控服務中的refuse指令來重新整理服務。是以我們需要建立一個新的包含Actuator服務的配置中心用戶端。

1.建立項目

SpringCloud-分布式配置中心【動态重新整理】
2.pom檔案

<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      

同時我們需要在碼雲中建立一個新的配置檔案

SpringCloud-分布式配置中心【動态重新整理】
SpringCloud-分布式配置中心【動态重新整理】

4.重新整理請求

 因為refresh指令隻支援post方式送出,是以我們不能直接在浏覽器中通路。

SpringCloud-分布式配置中心【動态重新整理】

現在擷取資訊

SpringCloud-分布式配置中心【動态重新整理】

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.測試

 在服務都在運作的情況下,修改碼雲中的配置資料

SpringCloud-分布式配置中心【動态重新整理】

通路資料為

SpringCloud-分布式配置中心【動态重新整理】

然後執行RestTemplate的post方式通路

SpringCloud-分布式配置中心【動态重新整理】

如此實作了在沒有重新啟動服務的情況下動态同步的配置資訊~