springcloud(四)消息总线Bus

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: '*'


新增配置:

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:

cloud-order测试controller:

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

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

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

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

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

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

重启cloud-user、cloud-order

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

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

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

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

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

发布了41 篇原创文章 · 获赞 79 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_33220089/article/details/103293234