Spring Cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring Cloud bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中。
Spring Cloud bus被国内很多都翻译为消息总线,也挺形象的。大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一,我们用一张图来描述bus在配置中心使用的机制。
根据此图我们可以看出利用Spring Cloud Bus做配置更新的步骤:
1、提交代码触发post给客户端A发送bus/refresh
2、客户端A接收到请求从Server端更新配置并且发送给Spring Cloud bus
3、Spring Cloud bus接到消息并通知给其它客户端
4、其它客户端接收到通知,请求Server端获取最新配置
5、全部客户端均获取到最新的配置
代码案例
1.添加服务器端的依赖
<!--spring cloud bus依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-bus -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-stream-binder-rabbit -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
2.在properties中的配置中添加Rabbitmq的配置
spring.rabbitmq.host=**.***.**.***
spring.rabbitmq.port=5672
spring.rabbitmq.username=******
spring.rabbitmq.password=******
#暴露触发消息总线的地址
management.endpoints.web.exposure.include=bus-refresh
3.在客户端的依赖添加如下:
<!--spring cloud bus依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-bus -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-stream-binder-rabbit -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
4.同理,在配置文件中,添加Rabbitmq的配置
5.启动项目。然后再码云上修改了配置文件,再本地先执行该步骤,即手动发送一个POST请求
http://127.0.0.1:12000/actuator/bus-refresh
6.然后请求其他请求,可以验证是已经自动编译了修改了配置的信息,而且是再没有重启的情况下,就执行了。
7.关于自己自定义的注解,再配置文件修改后,如果想在码云上修改就立即可用的话,需要在类中添加注解@RefreshScope即可自动读取自定义的配置文件信息了。