消息总线 —— Spring Cloud Bus

2022-05-13 10:20:34 浏览数 (1)

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

0 人点赞