需求
系统遇到这样一个需求,线上环境在配置文件发生变动时,可以不用经过重启,通过刷新接口的方式得到配置文件的加载,主要目的是为了迅速部署,避免因手动重启,出现数据或任务丢失的问题
问题
1.程序中如何获取修改后的配置
2.某些配置值是应用在bean里面的,在程序初始化的时候已经注入,如何修改这一部分。
解决
第一步,添加适合自己springboot版本的Springcloud context依赖,若Springboot版本低,maven可能会引不上高版本的context
我们这里参考 Spring-Cloud-Config 主要借助 org.springframework.cloud.context.refresh.ContextRefresher 这个类来实现配置刷新,因此需要对 SpringBoot 项目做一点修改。
配置文件: application.yml
读取配置的Bean,两种获取方式分别如下
开启刷新<code>@Value的</code>注解方式,注意下面的<code>@RefreshScoe</code>注解,这个必须有,否则更新后的配置不会同步
测试 <code>Controller </code>如下
启动上面的应用,然后开启愉快的测试,调用refresh接口,发现每次的返回都不一样(因为配置文件使用了random随机生成),但是访问show接口时,每次返回的都是一样的,也就是说refresh接口中确实实现了配置的刷新。
说明
使用<code>ConfigurationProperties</code>方式获取注解时,自动支持刷新配置
使用<code>@Value</code>注解的方式,需要开启<code>@RefreshScope</code>注解(上面没有演示不开启这个注解的情况, 建议有兴趣的可以自己尝试一下)
既然配置能刷新,那么如果我希望获取配置变更的事件,然后做一些其他的事情,是否ok呢?
其实进入 <code>ContextRefresher</code> 的源码,看下refresh接口,就很明确了
从上面的源码中,借助spring的事件通知机制,很简单就可以知道该怎么做了
注意下控制台的输出即可