一)什么是SpringCloudBus
Spring云总线使用轻量级消息代理链接分布式系统的节点。然后可以用它广播状态更改(例如配置更改)或其他管理指令。目前唯一的实现是使用AMQP代理作为传输,但是相同的基本功能集(以及更多依赖于传输的功能)取决于其他传输的路线图。
SpringCloudBus集成了市面上大部分的消息代理
主要解决的问题就是数据同步、数据的变更
二)使用Bus配置文件的更新
我们在使用Config成功进行了在不重启客户端的情况下刷新配置信息,但是这种刷新的方式有个致命的缺点,就是不支持集群,假如此时的客户端是个集群的时候,在进行访问服务刷新的时候就是极其繁琐的事情,需要对每个服务都要进行配置文件的刷新。
而上面介绍到Bus是一个的消息总线的代理,我们可以利用Bus的广播机制进行配置文件广播通知
下面是两张关于Bus实现广播通知的模型图。
1.第一种方式
这张图的执行实现流程是,当程序员对Server-A请求刷新的时候,先去GIT仓库获取最新的配置信息,然后获取到信息之后,将配置信息更新的消息通知给RibbitMQ,由RibbitMQ将请求的消息通知给集群中的其他服务,去GIT仓库获取最新的信息。
2.第二种方式
下面的这个的图的流程,如果Git仓库的信息发生了改变,就将刷新的通知,告知给RibbitMQ,让RibbitMQ的信息发送个给服务器集群中内的信息,告知他们的去GIT获取最新的配置文件。
相对于第一种,第二种的逻辑思维更加清晰科学。
三)使用客户端刷新的方式实现配置文件的同步
1.创建项目
2.pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sxt</groupId>
<artifactId>8-springcloud-ribbit</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>8-springcloud-ribbit</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--此坐标是整bus消息总线和RabbitMQ的坐标是必须的包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.修改全局配置文件信息,
1.添加RabbitMQ主机地址
2.添加连接的Git信息
server.port=7070
spring.application.name=8-springcloud-ribbit
eureka.client.service-url.defaultZone=http://peer1:8081/eureka/,http://peer2:8082/eureka/,http://peer3:8083/eureka/
#配置数据连接RabbitMQ的信息
spring.rabbitmq.host=192.168.177.140
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
spring.rabbitmq.virtual-host=/
#debug=true
#配置连接注册中心
spring.cloud.config.discovery.enabled=true
#对应 eureka 中的配置中心 serviceId,默认是 configserver
spring.cloud.config.discovery.serviceId=3-springCloud-config-server
#指定环境
spring.cloud.config.profile=dev
#git 标签
spring.cloud.config.label=master
#设置刷新请求
spring.aop.proxy-target-class=false
#开放/actuator下的全部端口
management.endpoints.web.exposure.include=*
4.测试信息
编写控制器
/**
* @project_name:ideaProject
* @date:2019/9/10:09:12
* @author:shinelon
* @Describe:
*/
@RestController
@RefreshScope
public class HelloController
{
@Value("${o-book}")
private String msg;
@GetMapping(value = "/hello")
public String hello(){
return this.msg;
}
}
测试值的获取,能够获取到值
在配置文件如果和开放了Autuator下的端口的话会在此处有显示,如果没有发送的刷新请求是不会被人可的。
修改值
刷新发送请求
public static void main(String[] args) {
String url ="http://localhost:7070/actuator/bus-refresh";
String info = HttpClientUtil.doPost(url);
System.out.println(info);
}
完成使用BUS消息总线进行配置文件的刷新。
总结:
1.注意导入的amqp的坐标是BUS下的
2.注意谁在的actuator需要开放下面的消息端口
3.连接的RabbitMQ
4.BUS可以实现对集群的消息通知
缺点:
1.和客户端的耦合度高
2.逻辑繁琐,流程走的很多
以上是基于Client刷新的配置信息