引言
之前有写过SpringCloud分布式配置中心的博客《微服务技术系列教程(24) - SpringCloud- 分布式配置中心》,主要讲解并实现了SpringCloud是如何在不启动服务器的情况下刷新配置文件,其原理图如下:
但是微服务里面有很多个ConfigClient的,如果一个全局配置文件修改了,那么每个CofingClient微服务都要主动去请求。
想想,有没有一种方法可以可以只通知一个微服务就可以广播给所有的微服务以达到所有微服务自动更新配置文件。没错,就是本文讲到的SpringCloud 消息总线。
1.消息总线
在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例,它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线。
SpringCloud中也有对应的解决方案,SpringCloud Bus 将分布式的节点用轻量的消息代理连接起来,可以很容易搭建消息总线,配合SpringCloud config 实现微服务应用配置信息的动态更新。
消息代理属于中间件。设计代理的目的就是为了能够从应用程序中传入消息,并执行一些特别的操作。开源产品很多如ActiveMQ、Kafka、RabbitMQ、RocketMQ等 。
2.代码实现
本文是基于前面博客的代码来实现的:《微服务技术系列教程(24) - SpringCloud-
分布式配置中心》,所以直接讲解消息总线了,前面的步骤不再详述。
大致过程如下:
1.克隆代码并导入IDEA:https://github.com/ylw-github/SpringCloud-DynamicConfig-Demo.git
2.导入三个项目
3.添加maven依赖:
<!--核心jar包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <!-- actuator监控中心 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
4.application.yml添加:
###开启bus刷新 management: endpoints: web: exposure: include: bus-refresh
5.运行RabbitMQ,集成的消息总线默认使用本地的RabbitMQ
./rabbitmq-server -detached
6.依次启动Eureka-Server、Config-Server、Config-Client
可以在本地RabbitMQ可以看见SpringCloudBus交换机:
还可以看到SpringCloud默认帮我们创建了两个队列:
7.复制Config-Client项目,修改端口(8883)以及服务名(config-client1),在Eureka注册中心可以看到:
8.浏览器输入:http://localhost:8882/getUserInfo、http://localhost:8883/getUserInfo,可以看到:
9.修改Github配置文件:
10.PostMan post请求:http://127.0.0.1:8882/actuator/bus-refresh
11.最后请求http://127.0.0.1:8883/actuator/bus-refresh,发现127.0.0.1:8883的也跟着修改了。