前言
写这篇文章,主要是为了记录springcloud相关组件做相关处理如动态刷新配置等所出现的问题,可能因版本不同,所以遇到的情况也不一样,这里每个问题的记录都会标记期对应的版本信息,以供参考。
SpringCloud Config配置动态刷新时/actuator/refresh不生效
版本说明
这里使用的是以下springcloud版本
<!--F版本的SpringCloud要配合2.0.2.RELEASE的spring-boot,不然会报"configua***类的错误",导致启动不了-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
一般要刷新配置,客户端的相关类要添加@RefreshScope注解,如下
@RestController
@RefreshScope//控制器类添加一个动态刷新是对@Value起作用的,configInfoProperties的是在它的类里添加
public class ConfigController {
@Autowired
private ConfigInfoProperties configInfoProperties;
@Value("${demo.value}")
private String value;
@GetMapping("/getmsg")
public String getMsg(){
System.out.println("value: "+value);
System.out.println("this config is: "+configInfoProperties.getConfig());
return configInfoProperties.getConfig();
}
}
对于配置类,在配置类上方直接添加@RefreshScope即可
@Component
@RefreshScope
@ConfigurationProperties(prefix = "cn.springcloud.book")
public class ConfigInfoProperties {
private String config;
public String getConfig() {
return config;
}
public void setConfig(String config) {
this.config = config;
}
}
注意:我这里是以github作为配置中心的,所以有关连接github的配置参考https://blog.csdn.net/esunlang/article/details/113791467即可,代码是同步的。
此时在浏览器请求以下地址:
http://localhost:9000/actuator/refresh
可能你会遇到404 405 或者不支持GET请求,这时按以下配置来解决
首先确定自己项目的pom是否有添加了以下依赖
其次确定配置项,配置文件为yml时请按以下方式配置,注意配置的是""
management:
endpoints:
web:
exposure:
include: ""
如果是properties的,则网上也有相关的说明,这里不演示,大概是说配置以下信息就可以了。
management.endpoints.web.exposure.include=*
上述两种配置文件的配置项一个是"" 一个是 * 起初我是在yml文件按照 * 直接配置,但是不生效,所以就改为第一种 ""
另外一种配置,也可以在yml配置文件里的include 配置项写成 refresh,这个配置是通过查看以下文章得到的信息
https://www.cnblogs.com/asaltydog/p/13505491.html,感谢作用的文章。
management:
endpoints:
web:
exposure:
include: refresh
刷新请求方式说明
要使用post请求,如果直接用浏览器请求,是GET请求,这时可以使用自己电脑WIN系统的cmd按以下发送,可以看到配置项更新了哪一个配置,它就会显示哪一个配置项内容:
动态刷新的原理
添加@RefreshScope,相当于是这个注解下的类会重新创建bean,且是懒加载的,使用时初始化。
执行前先请求一次 curl http://localhost:9000/getmsg ,确定没有=创建ConfigInfoProperties=这一行输出,之后再请求刷新请求curl http://localhost:9000/actuator/refresh -X POST ,此是还是没输出=创建ConfigInfoProperties= ,说明刷新时是没有初始化这个类的,之后再请求curl http://localhost:9000/getmsg,发现输出了,所以这是由于懒加载的原因。