1 SpringCloudBus干啥的呢?
由我上一篇文章集中配置组件SpringCloudConfig
我们已经知道了配置文件可以在远端做一个便捷的统一管理,这比较方便我们去查看和修改
但是呢,如果我们更新码云中的配置文件,那客户端数据查的是未修改状态数据,证明修改服务器中的配置并没有更新立刻到工程,只有重新启动程序才会读取配置。 那我们如果想在不重启微服务的情况下更新配置如何来实现呢? 我们使用SpringCloudBus来实现配置的自动更新
代码实现 主要利用了springboot的监听和消息中间件(这里用的rabbitmq)
1. config服务端
(1)修改config统一配置文件管理微服务的pom.xml,引用消息总线和rabbit依赖
代码语言:javascript复制 <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
(2)修改application.yml ,添加配置
代码语言:javascript复制spring:
rabbitmq:
host: 192.144.144.144
management:
endpoints:
web:
exposure:
include: bus-refresh //config里的消息总线配置
2 修改需要实时监听配置文件更新的微服务模块
我们还是以基础模块为例,加入消息总线
(1)修改base工程 ,引入依赖
这里发现导入bus模块时候与已有mysql版本冲突,具体的是mysql的drive无法识别,高版本的要求的driver不是com.mysql.jdbc.Driver,而我们使用的是dirver:com.mysql.jdbc.Driver,故为了防止引入jar包后由于我们没有指定mysql的版本号系统自动匹对更高版本的,所以我们这里特别引入了mysql的版本
代码语言:javascript复制 <dependency> <!--rabbitmq-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency><!-- springboot监听器 监听rabbitmq是否传入refresh-bus配置文件刷新-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency><!--消息总线bus-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency> //bus版本冲突,这里特别引用了mysql版本
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
(2)在码云的配置文件中配置rabbitMQ的地址:
代码语言:javascript复制 rabbitmq:
host: 192.144.144.144
(2)启动config模块 ,eureka模块和base模块 看是否正常运行
(3)修改码云上的配置文件 ,将数据库连接IP 改为127.0.0.1 ,在本地部署一份数据 库。
(4)postman测试 Url: http://127.0.0.1:12000/actuator/bus-refresh Method: post
(5)再次观察输出的数据是否是读取了本地的mysql数据。
这样就搞定了
注意:
我们上面自动刷新的配置信息仅限于框架自己的配置(比如数据库的链接地址)我们可以进行更新
如果我们在配置文件中定义了一些自己的自定义信息
比如:
代码语言:javascript复制yml文件中写
zyh: 177
我们在项目中定义
@value("${zyh}")
private String zyh;
这样搞的话,只能得到zyh的信息,如果我们在码云中修改,它是无法得到新的值的
如果们向得到新的值
需要在类上定义
代码语言:javascript复制@RefreshScope