SpringCloud笔记(六)SpringCloud+RabbitMQ消息总线刷新配置【Greenwich.SR1版本】

在之前的博客中介绍了一种手动刷新配置文件的方式:SpringCloud笔记(五)分布式配置中心,但是这种方式有严重的缺陷,就是当配置文件更新时,所有的客户端都必须手动POST发送actuator/refresh请求才能获取到最新的配置文件,这样未免也太麻烦了。SpringCloud Bus可以通过整合Kafka或RabbitMQ,通过发布/订阅模式,刷新配置。当Git中的配置文件更改后,只需要在Config Server端发送一次POST请求:actuator/bus-refresh,所有的客户端均会获取最新的配置文件内容。

说明:本博客是在上SpringCloud笔记(五)分布式配置中心的基础上进行代码改造,采用rabbitmq作为消息总线。

1、Config Server和Config Client的pom.xml添加如下依赖

由于我采用的是SpringBoot2.1.1Release版本,SpringCloud的版本是Greenwich.SR1,因此必须在Config Server和Config Client的pom.xml中引入如下依赖:

 
     org.springframework.boot
     spring-boot-starter-actuator
  
  
      org.springframework.cloud
      spring-cloud-starter-bus-amqp
      2.1.1.RELEASE

2、Config Client的bootstrap.yml和Config Server的application.yml中添加如下配置

management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

由于我的rabbitmq部署在本地,因此是默认配置,在配置文件中可以不配置,若是远程的rabbitmq,则需要在配置文件中指定地址、端口、用户名、密码等信息。

3、当都配置好之后,依次启动Eureka Server(端口8100)、Config Server(端口9090)、Config Client(一个9091),Config Client(一个9092)

查看Eureka Server:

SpringCloud笔记(六)SpringCloud+RabbitMQ消息总线刷新配置【Greenwich.SR1版本】_第1张图片

查看RabbitMQ,会自动创建一个SpringCloudBus的交换器,并绑定了三个队列(对应Config Server和两个Config Client):

SpringCloud笔记(六)SpringCloud+RabbitMQ消息总线刷新配置【Greenwich.SR1版本】_第2张图片

4、在git仓库上面创建一个如下的配置文件,并创建一个实体类进行对应:

SpringCloud笔记(六)SpringCloud+RabbitMQ消息总线刷新配置【Greenwich.SR1版本】_第3张图片

/**
 * 对应git上面的配置文件
 */
@Data
@Component
@ConfigurationProperties(prefix = "boy")
@RefreshScope
public class BoyConfig {
    private String name;
    private String sex;
    private Integer age;
}

控制层:

@RestController
public class BoyConfigController {

    @Autowired
    private BoyConfig boyConfig;

    @GetMapping("/boy")
    public String boy() {
        return "姓名:" + boyConfig.getName() + ",性别:" + boyConfig.getSex()
                + ",年龄:" + boyConfig.getAge();
    }

    /**
     * 推荐这种方式,将配置文件对应为一个实体类,统一管理
     */
}

5、重启两个Conig Client,并访问两个客户端,http://localhost:9091/boy和http://localhost:9092/boy

6、修改git配置文件,再次访问两个客户端

发现这时的配置还没有更新。

7、可以通过POSTMAN工具向Config Server发送POST请求:http://localhost:9090/acturator/bus-refresh.

8、再次访问:

发现两个客户端均已经更新为最新的配置了。

踩得坑:在学习SpringCloud Bus时踩了一个坑,原因是没有导入spring-cloud-bus-amqp整合包,而错误导入了spring-boot-starter-amqp,导致项目启动后消息队列一直没有自动创建成功!

项目地址:https://github.com/liuzhoujian/springcloud-learning

你可能感兴趣的:(SpringCloud)