惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
U
Unit 42
W
WeLiveSecurity
博客园 - Franky
Recent Announcements
Recent Announcements
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
月光博客
月光博客
The Cloudflare Blog
Spread Privacy
Spread Privacy
腾讯CDC
P
Privacy International News Feed
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
NISL@THU
NISL@THU
T
Troy Hunt's Blog
小众软件
小众软件
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Microsoft Security Blog
Microsoft Security Blog
L
Lohrmann on Cybersecurity
Webroot Blog
Webroot Blog
Y
Y Combinator Blog
量子位
P
Palo Alto Networks Blog
N
News and Events Feed by Topic
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
IT之家
IT之家
T
Threat Research - Cisco Blogs
Cloudbric
Cloudbric
云风的 BLOG
云风的 BLOG
C
Check Point Blog
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
G
Google Developers Blog
S
Secure Thoughts

博客园 - 立3807

ROS 系统架构及概念 ROS 在 Ubuntu 18.04 安装 利用 Skywalking 搭建 APM(应用性能管理)— 安装与配置 elasticsearch 集群搭建及启动常见错误 Git 基本操作 Git 环境配置 Git 安装 Git 基础和原理 Spring Cloud(Dalston.SR5)--Config 集群配置中心-加解密 Java NIO 概述 Spring Boot - AOP(面向切面)-切入点表达式 Spring Boot - AMQP 消息中间件 Spring Boot - AOP(面向切面) Spring Boot - 基础 POM 文件 Spring Boot - 配置介绍 Spring Boot - 项目构建与解析 Mycat 镜像-创建 Docker 镜像 Spring Cloud(Dalston.SR5)--Config 集群配置中心 Spring Cloud(Dalston.SR5)--Zuul 网关-Hystrix 回退 Spring Cloud(Dalston.SR5)--Zuul 网关-过滤器
Spring Cloud(Dalston.SR5)--Config 集群配置中心-刷新配置
立3807 · 2018-05-17 · via 博客园 - 立3807

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

本文版权归作者 李雪(博客地址:https://www.cnblogs.wiki)所有,欢迎转载和商用,请在文章页面明显位置给出原文链接并保留此段声明,否则保留追究法律责任的权利,其他事项,可留言咨询。