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/test、localhost: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/test、localhost:8900/test
漂亮,name已经加载到最新的配置文件,这样配置后,以后修改配置文件就无需再次重启服务,是不是不要太爽?
源码:https://github.com/361426201/springcloud