Spring Cloud Bus 配置文件实现自动更新


上篇文章中描述了使用git仓库保存项目的配置文件,其他项目通过关联配置中心,实现统一配置中心。

在生产环境中,很少通过重启项目来改变项目的配置文件的。本篇将对Spring Cloud Bus如何实现保证项目运行的过程下,改变远程git仓库中的配置文件,看下项目中是否会自动刷新这些配置呢?

这里借用下廖师兄的图

我们在配置中心config-serverorder中添加Spring Cloud Bus的依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

之所以引入上述的依赖,是因为我们要通过这个依赖将项目和RabbitMQ联系起来。分别启动配置中心和product。启动成功之后,我们可以看到在RabbitMQ的Queues中看到我们启动的项目。

到了这里,我们使用RabbitMQ实现了config-serverproduct之间的通讯。我们修改远程git仓库的配置文件,这时候我们是不知道仓库是做了什么配置。因为仓库没通知我它改了配置文件,config-server获取的数据还是之前获取到的数据的。这时候,我们需要做什么呢?

  1. config-server暴露bus-refresh,让远程git仓库在改变配置文件之后,调接口通知config-server配置中心。需要在pom.xml中添加配置。
# 让bus-refresh接口暴露出来
management:
  endpoints:
    web:
      exposure:
        include: "*"
  1. 远程git通知配置中心,远程git仓库的配置文件有更新。在本地命令行中模拟git向config-server发送通知。
$ curl -v -X POST "http://localhost:8080/actuator/bus-refresh" 
  1. (坑)这时候你刷新你的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
    }
}

再次启动项目,修改配置,启动中的项目访问到修改好的配置。本地的项目实现了配置文件的自动更新


 上一篇
项目中RabbitMQ的基本使用 项目中RabbitMQ的基本使用
简单介绍在项目中基本使用RabbitMQ,从RabbitMQ的接收和发送信息来举例 RabbitMQ的引入项目引入spring cloud Bus的依赖,完成项目中服务与RabbitMQ的连接 <dependency> &
2020-08-22
下一篇 
spring cloud config spring cloud config
学习Spring Cloud Config 要学习这部分的知识需要先了解配置中心的工作流程 配置中心服务器端配置中心的依赖 <dependency> <groupId>org.springframework.cloud
2020-08-18
  目录