BUS介绍

Spring Cloud Bus将分布式系统的节点与轻量级消息代理链接。这可以用于广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是,Bus就像一个扩展的Spring Boot应用程序的分布式执行器,但也可以用作应用程序之间的通信渠道。当前唯一的实现是使用AMQP代理作为传输,但是相同的基本功能集(还有一些取决于传输)在其他传输的路线图上。

简单点来说,就是动态刷新配置中心配置文件,让服务可以不用重启就能让配置文件生效,bus在配置中心通过广播的形式来告诉所有订阅者刷新配置文件,目前这种机制采用消息队列实现,支持rabbitmq、Kafka消息队列,我将用rabbitmq介绍一下bus的具体使用。

搭建环境

1.新建eureka 请参考:springcloud(一)注册中心eureka

2.新建config配置中心 请参考:springcloud(二)配置中心config

3.在cloud-config服务端

引入bus服务端依赖

<!--健康检查-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

<!--消息总线bus-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
bootstrap.yml配置文件引入rabbitmq以及放开权限:
server:
  port: 9100  #端口

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/ #注册中心地址

spring:
  application:
    name: cloud-config  #服务名
  profiles:
#    active: native #拉取本地配置
      active: git #拉取git配置
  #    active: subversion
  cloud:
    bus:
      trace:
        enabled: true
      enabled: true
    config:
      server:
#        native:
#          search-locations: file:F:\git\springcloud\config #本地拉起
          git:
            uri: https://github.com/361426201/cloud-config.git #git地址   需要注意一点,我拉取的是公共仓库,不需要用户名和密码,如果你拉取的是私有仓库,需要加上用户名密码
#            username: xxxx
        #    password: xxxx
          label: master #指定拉取git的那个分支
  #        svn:
  #          uri: xxxxxxxxxxxxx  #svn的地址
  #          username: xxx  #用户名
  #          password: xxx  #密码
  #          default-label: trunk  #类似git中的分支
  #          search-paths: {application}  #可有可无
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

management:
  endpoints:
    web:
      exposure:
        include: '*'

新增配置:

springcloud bus事件驱动_bus

4.配置客户端1:cloud-user     2:cloud-order       引入依赖:  

<!--消息总线bus-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

启动cloud-eureka、cloud-config、cloud-user、cloud-order  

cloud-user测试controller:

springcloud bus事件驱动_spring_02

cloud-order测试controller:

springcloud bus事件驱动_bus_03

第一次访问分别访问localhost:8800/test、localhost:8900/test

springcloud bus事件驱动_bus_04

springcloud bus事件驱动_config_05

 现在修改git上面的配置文件

springcloud bus事件驱动_spring_06

springcloud bus事件驱动_config_07

现在再次访问,你会发现name并没有发生改变,那是因为bus需要手动刷新,所以还需要一步

5.访问接口:localhost:9100/actuator/bus-refresh     POST请求方式

springcloud bus事件驱动_配置文件自动刷新_08

 再次访问:你会发现配置文件还是没有发生变化

springcloud bus事件驱动_spring_09

name还是张三,并没有变成tom,这是为什么呢? 这个坑让我好找,这是因为我们还缺少一个注解,那就是在使用配置的类中加入:@RefreshScope

springcloud bus事件驱动_config_10

springcloud bus事件驱动_配置文件自动刷新_11

重启cloud-user、cloud-order

不过,我们还需要再次修改一下git上面的配置文件

springcloud bus事件驱动_spring_12

springcloud bus事件驱动_bus_13

刷新配置文件:localhost:9100/actuator/bus-refresh

再次访问:localhost:8800/test、localhost:8900/test

springcloud bus事件驱动_bus_14

springcloud bus事件驱动_config_15

漂亮,name已经加载到最新的配置文件,这样配置后,以后修改配置文件就无需再次重启服务,是不是不要太爽?

 

源码:https://github.com/361426201/springcloud