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

         

         

  • 相关阅读:
    OutputCache 缓存key的创建 CreateOutputCachedItemKey
    Asp.net Web Api源码调试
    asp.net mvc源码分析DefaultModelBinder 自定义的普通数据类型的绑定和验证
    Asp.net web Api源码分析HttpParameterBinding
    Asp.net web Api源码分析HttpRequestMessage的创建
    asp.net mvc源码分析ActionResult篇 RazorView.RenderView
    Asp.Net MVC 项目预编译 View
    Asp.net Web.config文件读取路径你真的清楚吗?
    asp.net 动态创建TextBox控件 如何加载状态信息
    asp.net mvc源码分析BeginForm方法 和ClientValidationEnabled 属性
  • 原文地址:https://www.cnblogs.com/li3807/p/9053913.html
Copyright © 2011-2022 走看看