视频链接:2020最新版SpringCloud框架开发教程-周阳
文章源码:https://github.com/geyiwei-suzhou/cloud2020/
为了演示广播效果,仿照 SpingCloud 2020微服务教程【36】配置中心之客户端配置 中cloud-config-client-3355模块,新建cloud-config-client-3366(只有端口号区别)
全局广播设计思想:
- 利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置
- 利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置
方案二
更适合做全局广播,原因:
- 方案一打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担刷新的职责
- 破坏了微服务各节点的对等性
- 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改
cloud-config-center-3344模块
改pom:配置中心服务端添加消息总线支持
<!-- 添加消息总线RabbitMQ支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
写yml:在spring节点下
添加如下子节点
# rabbitmq相关配置
rabbitmq:
host: localhost
port: 5672
usrname: guest
password: guest
添加暴露bus刷新配置的端点
# 暴露bus刷新配置的端点
management:
endpoints: # 暴露bus刷新配置的端点
web:
exposure:
include: 'bus-refresh'
cloud-config-client-3355、cloud-config-client-3366模块
改pom:配置中心客户端添加消息总线支持
<!-- 添加消息总线RabbitMQ支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
写yml:在spring节点下添加如下子节点
# rabbitmq相关配置
rabbitmq:
host: localhost
port: 5672
usrname: guest
password: guest
添加暴露bus刷新配置的端点
# 暴露bus刷新配置的端点
management:
endpoints: # 暴露bus刷新配置的端点
web:
exposure:
include: 'bus-refresh'
启动:启动:cloud-config-center-3344,cloud-config-client-3355,cloud-config-client-3366 三个模块
访问:http://config-3344.com:3344/config-dev.yml、http://localhost:3355/configInfo、http://localhost:3366/configInfo
然后修改github上config-dev.yml配置文件中的version,刷新 http://config-3344.com:3344/config-dev.yml,发现版本号已经改变, 但 http://localhost:3355/configInfo、http://localhost:3366/configInfo 还是旧的版本号
这是我们执行一下如下命令:
curl -X POST "http://localhost:3344/actuator/bus-refresh"
然后再访问 http://localhost:3355/configInfo、http://localhost:3366/configInfo 发现成功通知到各个子模块
访问:http://localhost:15672/#/exchanges 发现Exchanges中出现springCloudBus主题
上面完成了全局广播,现在我们想实现定点通知
/bus/refresh请求不再发送到具体的服务实例上,而是发给config server并通过destination参数指定需要更新配置的服务或实例
http://ip:port/actuator/bus-refresh/{destination}
destination:服务名:端口号
如通知cloud-config-client-3355模块,不通知cloud-config-client-3366模块,则使用如下命令:
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"