上篇文章中描述了使用git仓库保存项目的配置文件,其他项目通过关联配置中心,实现统一配置中心。
在生产环境中,很少通过重启项目来改变项目的配置文件的。本篇将对Spring Cloud Bus如何实现保证项目运行的过程下,改变远程git仓库中的配置文件,看下项目中是否会自动刷新这些配置呢?
这里借用下廖师兄的图
我们在配置中心config-server
和order
中添加Spring Cloud Bus
的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
之所以引入上述的依赖,是因为我们要通过这个依赖将项目和RabbitMQ联系起来。分别启动配置中心和product。启动成功之后,我们可以看到在RabbitMQ的Queues
中看到我们启动的项目。
到了这里,我们使用RabbitMQ实现了config-server
和product
之间的通讯。我们修改远程git仓库的配置文件,这时候我们是不知道仓库是做了什么配置。因为仓库没通知我它改了配置文件,config-server
获取的数据还是之前获取到的数据的。这时候,我们需要做什么呢?
config-server
暴露bus-refresh
,让远程git仓库在改变配置文件之后,调接口通知config-server
配置中心。需要在pom.xml
中添加配置。
# 让bus-refresh接口暴露出来
management:
endpoints:
web:
exposure:
include: "*"
- 远程git通知配置中心,远程git仓库的配置文件有更新。在本地命令行中模拟git向
config-server
发送通知。
$ curl -v -X POST "http://localhost:8080/actuator/bus-refresh"
- (坑)这时候你刷新你的uri地址发现,配置还是没有刷新出来。
该怎么做配置才能被获取到呢?需要在获取配置的类上边加上@RefreshScope
这个注解。使用@RefreshScope
表示:告诉系统要对标注@RefreshScope
的类进行配置刷新
@RestController
@RequestMapping("/env")
@RefreshScope
public class ConfigController {
@Value("${env}") // TODO @Value("${env}")获取配置文件中env的值 如env = "config"
private String env;
@GetMapping("/getConfig")
public String getConfig() {
return env; // TODO 返回config
}
}
再次启动项目,修改配置,启动中的项目访问到修改好的配置。本地的项目实现了配置文件的自动更新