博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot基础篇配置信息之配置刷新
阅读量:6986 次
发布时间:2019-06-27

本文共 4052 字,大约阅读时间需要 13 分钟。

hot3.png

更多Spring文章,欢迎点击

配置的刷新,从第一篇就提出了这个问题,但是一直都没有说到,那么配置加载完毕之后能否在主动刷新呢?

如果对SpringCloud有了解的话,会直到有个配置中心的微服务,专门就是来做配置远程拉取,当然也支持刷新了,这是否意味着可以支持刷新呢,如果支持该怎么做?

<!-- more -->

I. 配置动态刷新

本篇将介绍并演示如何实现配置信息的刷新,但不会涉及到底层的实现原理,想要探究里面的神奇,可以网上google一下,或者期待后续的源码分析篇

1. ContextReferer

我们这里主要借助这个类来实现配置刷新,至于从哪里捞出来的这个东西,从Spring-Cloud-Config出发,看了下它怎么玩的,然后依葫芦画瓢

这个类全路径为 org.springframework.cloud.context.refresh.ContextRefresher,因此你的SpringBoot项目需要做一点修改

org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-context
org.springframework.cloud
spring-cloud-dependencies
Finchley.RELEASE
pom
import

接下来就简单了,直接调用这个类的refresh()方法就可以了,just so easy~

2. 代码演示

配置文件: application.yml

biz:  refresh: ${random.long}  key: refresh-testrest:  uuid: ${random.uuid}server:  port: 8081

读取配置的bean,演示了两种获取方式,分别如下

@Data@Component@ConfigurationProperties(prefix = "biz")public class BizConfig {    private String key;    private Long refresh;}

开启刷新的@Value注解方式,注意下面的@RefreshScoe注解,这个必须有,负责更新后的配置不会同步

@Data@RefreshScope@Componentpublic class ValueConfig {    @Value("${rest.uuid}")    private String uuid;}

测试Controller如下

@RestControllerpublic class DemoController {    @Autowired    private ContextRefresher contextRefresher;    @Autowired    private BizConfig bizConfig;    @Autowired    private ValueConfig valueConfig;    @GetMapping(path = "/show")    public String show() {        JSONObject res = new JSONObject();        res.put("biz", JSONObject.toJSONString(bizConfig));        res.put("uuid", valueConfig.getUuid());        return res.toJSONString();    }    @GetMapping(path = "/refresh")    public String refresh() {        new Thread(() -> contextRefresher.refresh()).start();        return show();    }}

3. 实例演示

启动上面的应用,然后开启愉快的测试,调用refresh接口,发现每次的返回都不一样(因为配置文件使用了random随机生成),但是访问show接口时,每次返回的都是一样的,也就是说refresh接口中确实实现了配置的刷新

实例演示

说明

  • 使用ConfigurationProperties方式获取注解时,自动支持刷新配置
  • 使用@Value注解的方式,需要开启@RefreshScope注解(上面没有演示不开启这个注解的情况, 建议有兴趣的可以自己尝试一下)

II. 配置变更监听

既然配置能刷新,那么如果我希望获取配置变更的事件,然后做一些其他的事情,是否ok呢?

其实进入 ContextRefresher 的源码,看下refresh接口,就很明确了

public synchronized Set
refresh() { Map
before = extract( this.context.getEnvironment().getPropertySources()); addConfigFilesToEnvironment(); Set
keys = changes(before, extract(this.context.getEnvironment().getPropertySources())).keySet(); // 注意这一行,抛出了一个变更事件 this.context.publishEvent(new EnvironmentChangeEvent(context, keys)); this.scope.refreshAll(); return keys;}

1. 配置变更监听

从上面的源码中,借助spring的事件通知机制,很简单就可以知道该怎么做了,来一个简单的demo,这里顺带测试下上面漏掉的不刷新的场景

@RestControllerpublic class DemoController {    @Autowired    private ContextRefresher contextRefresher;    @Autowired    private BizConfig bizConfig;    @Autowired    private ValueConfig valueConfig;    @Value("${rest.uuid}")    private String uuid;    @GetMapping(path = "/show")    public String show() {        JSONObject res = new JSONObject();        res.put("biz", JSONObject.toJSONString(bizConfig));        res.put("uuid", valueConfig.getUuid());        res.put("no-refresh", uuid);        return res.toJSONString();    }    @GetMapping(path = "/refresh")    public String refresh() {        new Thread(() -> contextRefresher.refresh()).start();        return show();    }    @EventListener    public void envListener(EnvironmentChangeEvent event) {        System.out.println("conf change: " + event);    }}

直接将Listener写在Controller类内部... 原则上不推荐上面的写法

2. 实测

依然来个实测,主要注意下控制台的输出即可

配置刷新事件监听

III. 其他

0. 项目

  • 工程:
  • modal:

1. 一灰灰Blog

  • 一灰灰Blog个人博客
  • 一灰灰Blog-Spring专题博客

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

  • 微博地址:
  • QQ: 一灰灰/3302797840

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals

转载于:https://my.oschina.net/u/566591/blog/2245509

你可能感兴趣的文章
JAVA 序列化(转)
查看>>
随手笔记NO.4
查看>>
未来监护人:FCC专员正在努力推迟网络中立投票
查看>>
LVS负载均衡群集(LVS-NAT)
查看>>
当区块链走进象牙塔:耶鲁系与浙大系首度碰撞
查看>>
ssh配置免密码登录,一句搞定。
查看>>
nodejs渐入佳境[16]-node express项目部署到heroku
查看>>
nodejs渐入佳境[21]-express+mondoDB应用部署到heroku
查看>>
营销圈带你看比伯结婚在中国引起热论背后的故事
查看>>
别急!新鲜的云硬盘让它再凉一会
查看>>
【Zabbix】如何搭建memcached?并使用Zabbix监控memcached?
查看>>
完爆 Best Fit,看阿里如何优化 Sigma 在线调度策略节约亿级成本
查看>>
spring事务
查看>>
NoSQL最新现状和趋势:云NoSQL数据库将成重要增长引擎
查看>>
python系统监控--转载
查看>>
2019年我国云计算行业存在的问题和发展趋势
查看>>
MySQL 每秒 570000 的写入,如何实现?
查看>>
DXF图纸打开后怎么改变保存其格式为DWG?
查看>>
zabbix 监控 介绍
查看>>
SVN使用
查看>>