zoukankan      html  css  js  c++  java
  • Spring Cloud(Dalston.SR5)--Config 集群配置中心-刷新配置

    远程 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测试,修改后的"

         

         

  • 相关阅读:
    java前三章总结
    Java入门第二章
    MYSQL 3306设置允许外网访问
    Lnmp Laravel搭建网站需要注意的几点:
    Linux 如何删除网站目录下的user.ini
    Linux Composer的安装
    lnmp切换PHP版本
    解决GitHub的raw.githubusercontent.com无法连接问题
    Linux 7系列默认不能连网的解决办法
    lnmp安装
  • 原文地址:https://www.cnblogs.com/li3807/p/9053913.html
Copyright © 2011-2022 走看看