一)什么是SpringCloudBus

Spring云总线使用轻量级消息代理链接分布式系统的节点。然后可以用它广播状态更改(例如配置更改)或其他管理指令。目前唯一的实现是使用AMQP代理作为传输,但是相同的基本功能集(以及更多依赖于传输的功能)取决于其他传输的路线图。

SpringCloudBus集成了市面上大部分的消息代理

springcloud 修改数据库配置_spring

主要解决的问题就是数据同步、数据的变更

二)使用Bus配置文件的更新

我们在使用Config成功进行了在不重启客户端的情况下刷新配置信息,但是这种刷新的方式有个致命的缺点,就是不支持集群,假如此时的客户端是个集群的时候,在进行访问服务刷新的时候就是极其繁琐的事情,需要对每个服务都要进行配置文件的刷新。
而上面介绍到Bus是一个的消息总线的代理,我们可以利用Bus的广播机制进行配置文件广播通知

下面是两张关于Bus实现广播通知的模型图。
1.第一种方式
这张图的执行实现流程是,当程序员对Server-A请求刷新的时候,先去GIT仓库获取最新的配置信息,然后获取到信息之后,将配置信息更新的消息通知给RibbitMQ,由RibbitMQ将请求的消息通知给集群中的其他服务,去GIT仓库获取最新的信息。

springcloud 修改数据库配置_spring_02

2.第二种方式
下面的这个的图的流程,如果Git仓库的信息发生了改变,就将刷新的通知,告知给RibbitMQ,让RibbitMQ的信息发送个给服务器集群中内的信息,告知他们的去GIT获取最新的配置文件。
相对于第一种,第二种的逻辑思维更加清晰科学。

springcloud 修改数据库配置_ci_03

三)使用客户端刷新的方式实现配置文件的同步

1.创建项目

springcloud 修改数据库配置_springcloud 修改数据库配置_04

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;
    }
}

测试值的获取,能够获取到值

springcloud 修改数据库配置_spring_05

在配置文件如果和开放了Autuator下的端口的话会在此处有显示,如果没有发送的刷新请求是不会被人可的。

springcloud 修改数据库配置_ci_06

修改值

springcloud 修改数据库配置_spring_07

刷新发送请求

public static void main(String[] args) {
    String url ="http://localhost:7070/actuator/bus-refresh";
    String info = HttpClientUtil.doPost(url);
    System.out.println(info);
}

完成使用BUS消息总线进行配置文件的刷新。

springcloud 修改数据库配置_ci_08

总结:
1.注意导入的amqp的坐标是BUS下的
2.注意谁在的actuator需要开放下面的消息端口
3.连接的RabbitMQ
4.BUS可以实现对集群的消息通知

缺点:
1.和客户端的耦合度高
2.逻辑繁琐,流程走的很多
以上是基于Client刷新的配置信息