13.5 动态刷新
在 Git 中的配置文件更改后,默认 config server 可以及时感知到变化,但 config client 不会及时感知到变化,config-client 只有重启才能加载到最新文件,为了解决这个问题,介绍一种使用 spring-boot-start-acuator 解决办法
- 1.在 config client 的 pom.xml 中添加 spring-boot-start-acuator 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
- 2.添加配置,使 actuator 中的 refresh 端点暴露出来,即在 bootstrap.properties 中添加
management.endpoints.web.exposure.include=refresh
:
# 下面三行配置分别对应 config-server 中的{application}、{profile}、{label}占位符
spring.application.name=client1
spring.cloud.config.label=master
spring.cloud.config.profile=dev
#注释原来写死的内容
#spring.cloud.config.uri=http://localhost:8081
server.port=8082
spring.cloud.config.username=javaboy
spring.cloud.config.password=123
# eureka 注册地址
eureka.client.service-url.defaultZone=http://localhost:1111/eureka
# 启动 spring cloud 配置发现
spring.cloud.config.discovery.enabled=true
# spring cloud 配置发现的服务名
spring.cloud.config.discovery.service-id=config-server
# 把 actuator 的 refresh 端点暴露出来
management.endpoints.web.exposure.include=refresh
- 3.在 config client 的使用了配置文件的地方,加上 @RefreshScope 注解:
@RestController
@RefreshScope
public class HelloController {
@Value("${javaboy}")
String javaboy;
@GetMapping("/hello")
public String hello(){
return javaboy;
}
}
- 4.当配置文件改动后,只需要调用 refresh 端点,config client 中的配置就可以自动刷新了
正常访问未调用 refresh 地址:
修改 Git 仓库的 client1-dev.properties 文件,使密文是 dev888 生产的
提交到 Git
第二次正常访问未调用 refresh 地址:management.endpoints.web.exposure.include=refresh
,结果没变:
而访问 config server 时,发现已经更改为 dev888
调用 refresh 接口
调用完成
最后,第三次正常访问已调用 refresh 地址:
变成 dev888 了,这样就不用重启 config client 服务就能加载配置文件了,这就是利用 spring boot actuctor 动态刷新配置文件的方式。 - 5.这样虽然是一种解决方案,但是有一个弊端就是如果有很多地方获取配置文件,每个地方都要加 @RefreshScope 注解吗,比如与上百个这样的地方,怎么办?这里先做简单提及,可以使用 Spring Cloud Bus 来解决,具体的方案以后完善博客;