1. 程式人生 > >Spring Cloud(Dalston.SR5)--Config 集群配置中心-刷新配置

Spring Cloud(Dalston.SR5)--Config 集群配置中心-刷新配置

增加 文件的 處理 ext Delve yml lns localhost out

遠程 SVN 服務器上面的配置修改後,需要通知客戶端來改變配置,需要增加 spring-boot-starter-actuator 依賴並將

management.security.enabled 設置為 false,然後訪問客戶端的 /refresh 端點進行刷新,訪問改端點要使用 HTTP 的 POST 方法,客戶端的 refresh 在接收到請求後,會重新到配置服務器獲取最新的配置,然後用新的配置和舊配置進行對比,最終把有修改的配置 Key 返回給調用者。

在實際應用中,往往不僅是刷新一個配置的值那麽簡單,由於 Spring 容器中的很多 Bean 都是根據某個屬性值來進行初始化的,配置一旦更新,需要重建這個 Bean 的實例,為了解決這個問題,可以使用 @RefreshScope 註解來標註 Bean,但 /refresh 端點被訪問時,負責處理刷新的 ContextRefresher 類,會先去遠程的配置服務刷新配置,然後再調用 RefreshBean 的 refreshAll 方法來處理實例,容器中使用了 @RefreshScope 註解進行修飾的 Bean,都會在緩存中銷毀,當這些 Bean 被再次引用時,就會創建新的實例,從而達到刷新的效果。

? ?

刷新配置示例

  • 增加依賴

    為了支持配置文件的刷新操作,需要增加依賴 spring-boot-starter-actuator ,修改 POM.xml 文件內容如下:

    <?xmlversion="1.0"encoding="UTF-8"?>

    <projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"

    >

    <modelVersion>4.0.0</modelVersion>

    ? ?

    <groupId>org.lixue.config</groupId>

    <artifactId>spring-cloud-config-client</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <packaging>jar</packaging>

    ? ?

    <name>spring-cloud-config-client

    </name>

    ? ?

    <parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>1.5.12.RELEASE</version>

    <relativePath/><!--lookupparentfromrepository-->

    </parent>

    ? ?

    <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <java.version>1.8</java.version>

    <spring-cloud.version>Dalston.SR5</spring-cloud.version>

    </properties>

    ? ?

    <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>

    ? ?

    <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-test</artifactId>

    <scope>test</scope>

    </dependency>

    </dependencies>

    ? ?

    <dependencyManagement>

    <dependencies>

    <dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-dependencies</artifactId>

    <version>${spring-cloud.version}</version>

    <type>pom</type>

    <scope>import</scope>

    </dependency>

    </dependencies>

    </dependencyManagement>

    ? ?

    <build>

    <plugins>

    <plugin>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-maven-plugin</artifactId>

    </plugin>

    </plugins>

    </build>

    </project>

? ?

  • 增加配置

    修改 src/main/resources 目錄下的 bootstrap.yml 配置文件,內容如下:

    #配置應用名稱

    spring:

    application:

    name:spring-cloud-config-client

    #配置分布式配置中心地址和相關配置

    cloud:

    config:

    uri:http://localhost:8080

    #表示分支,客戶端配置後,會替換到分布式配置中心的default-lable配置

    label:test

    #表示配置文件名稱,如果不配置則使用spring.application.name配置項

    name:spring-cloud-config-client

    #表示配置文件的profile,實際獲取文件為${spring.cloud.config.name}-${spring.cloud.config.profile}.yml

    profile:dev

    # 關閉管理安全控制

    management:

    security:

    enabled:false

    ? ?

  • 測試REST服務

    Info 類的 Bean 是根據配置文件的 info.name 和 info.desc 屬性來創建的,newInfo 方法被註解 @Bean 和 @RefreshScope 標註,表示刷新時,需要從緩存銷毀。

    package org.lixue.config;

    ? ?

    import org.springframework.beans.factory.annotation.Autowired;

    import org.springframework.cloud.context.config.annotation.RefreshScope;

    import org.springframework.context.annotation.Bean;

    import org.springframework.core.env.Environment;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RequestMethod;

    import org.springframework.web.bind.annotation.RestController;

    ? ?

    @RestController

    public class MyRESTController{

    @Autowired

    private Environment environment;

    ? ?

    @Autowired

    private Info info;

    ? ?

    @RequestMapping(path="/",method=RequestMethod.GET)

    public String getApplicationName(){

    return environment.getProperty("spring.application.name");

    }

    ? ?

    @RequestMapping(path="/myInfo",method=RequestMethod.GET)

    public String getInfo(){

    return info.getName()+"-"+info.getDesc();

    }

    ? ?

    @Bean

    @RefreshScope

    public Info newInfo(){

    Info info=new Info();

    info.setName(environment.getProperty("info.name","null"));

    info.setDesc(environment.getProperty("info.desc","null"));

    return info;

    }

    ? ?

    static class Info{

    private String name;

    private String desc;

    ? ?

    public String getName(){

    returnname;

    }

    ? ?

    public void setName(Stringname){

    this.name=name;

    }

    ? ?

    public String getDesc(){

    returndesc;

    }

    ? ?

    public voids etDesc(Stringdesc){

    this.desc=desc;

    }

    }

    }

    ? ?

  • 測試驗證

    首先啟動 spring-cloud-config 項目和 SVN 服務,目前 SVN 服務的相關配置文件內容如下:

    spring:

    application:

    name:spring-cloud-config-client-dev

    server:

    port:8013

    info:

    name:refresh

    desc:刷新Bean測試

    訪問 http://localhost:8013/myInfo 返回結果為:"refresh-刷新Bean測試",修改 SVN 服務的相關配置文件內容如下:

    spring:

    application:

    name:spring-cloud-config-client-dev

    server:

    port:8013

    info:

    name:refresh

    desc:刷新Bean測試,修改後的

    使用 HTTP 的 POST 方法訪問 http://localhost:8013/refresh ,然後再次訪問 http://localhost:8013/myInfo ,可以看到返回結果已經返回了新配置文件的內容:"refresh-刷新Bean測試,修改後的"

    ? ?

    ? ?

Spring Cloud(Dalston.SR5)--Config 集群配置中心-刷新配置