Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。本文要讲述的是用Spring Cloud Bus实现通知微服务架构的配置文件的更改。
一、准备工作
本文还是基于上一篇文章来实现。按照官方文档,我们只需要在配置文件中配置 spring-cloud-starter-bus-amqp ;这就是说我们需要装rabbitMq,点击rabbitmq下载,点击erlang下载。上两个下载都是百度网盘的链接,也可以https://download.csdn.net/download/snowwolf9999/10551353帮我加点CSDN分,嘿嘿。
具体安装erlang环境,参考https://www.cnblogs.com/PPBoy/p/9335943.html。
二、改造eureka-config-client工程。
在pom文件加上起步依赖spring-cloud-starter-bus-amqp和spring-boot-starter-actuator。
<dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-bus-amqpartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-actuatorartifactId>dependency>
完整的配置文件如下&#xff1a;
<project xmlns&#61;"http://maven.apache.org/POM/4.0.0" xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation&#61;"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0modelVersion><groupId>com.sungroupId><artifactId>eureka-config-clientartifactId><version>0.0.1-SNAPSHOTversion><packaging>jarpackaging><name>config-clientname><description>Demo project for Spring Bootdescription><parent><groupId>com.sungroupId><artifactId>springcloud-parentartifactId><version>0.0.1-SNAPSHOTversion>parent><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-configartifactId>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-bus-amqpartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-actuatorartifactId>dependency>dependencies>
project>
在配置文件application.yml中加上RabbitMq的配置&#xff0c;包括RabbitMq的地址、端口&#xff0c;用户名、密码。并需要加上spring.cloud.bus的三个配置&#xff0c;具体如下&#xff1a;
spring:application:name: config-clientcloud:config:label: masterprofile: dev#uri: http://localhost:8888/bus:enabled: truetrace:enabled:truediscovery:enabled: trueserviceId: config-serverrabbitmq: host: localhostport: 5672username: guestpassword: guesteureka:client:serviceUrl:defaultZone: http://localhost:8888/eureka/
server:port: 8881management: endpoints:web:exposure:include: bus-refresh
ConfigClientApplication启动类代码如下&#xff1a;
package com.sun;import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;&#64;SpringBootApplication
&#64;RestController
&#64;EnableEurekaClient
&#64;RefreshScope //添加注释
public class ConfigClientApplication {public static void main(String[] args) {SpringApplication.run(ConfigClientApplication.class, args);}&#64;Value("${foo}")String foo;&#64;RequestMapping(value &#61; "/hi")public String hi(){return foo;}
}
这时我们去代码仓库将foo的值改为“foo version 4”&#xff0c;即改变配置文件foo的值。如果是传统的做法&#xff0c;需要重启服务&#xff0c;才能达到配置文件的更新。此时&#xff0c;我们只需要发送post请求&#xff1a;http://localhost:8881/actuator/bus-refresh&#xff0c;你会发现config-client会重新读取配置文件&#xff1a;
c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888
tip&#xff1a;这里发送post请求可以用postman&#xff1a;
写地址发送就可以了&#xff0c;这时我们再访问http://localhost:8881/hi 或者http://localhost:8882/hi 浏览器显示&#xff1a;
foo version 4
另外&#xff0c;/actuator/bus-refresh接口可以指定服务&#xff0c;即使用”destination”参数&#xff0c;比如 “/actuator/bus-refresh?destination&#61;customers:**” 即刷新服务名为customers的所有服务。
三、分析
此时的架构图&#xff1a;
当git文件更改的时候&#xff0c;通过pc端用post 向端口为8881的config-client发送请求/bus/refresh&#xff0f;&#xff1b;此时8881端口会发送一个消息&#xff0c;由消息总线向其他服务传递&#xff0c;从而使整个微服务集群都达到更新配置文件。
当然&#xff0c;向端口8882的服务发送也可以。
最后说一下http://localhost:8881/actuator/bus-refresh不能成功刷新&#xff0c;基本上有2种可能&#xff1a;
1、查看rabbitmq是否安装完毕&#xff0c;是否运行。查看rabbitmq状态&#xff0c;参考&#xff1a;https://blog.csdn.net/lglgsy456/article/details/79045850
2、必须是post请求。可以由postman模拟发送。
本文绝大部分参考博客&#xff1a;https://blog.csdn.net/forezp/article/details/81041062 再次对博主表示感谢。