0. 接Config最后问题
问题:目前手动刷新还是存在问题,就算是写脚本每次执行一遍也很麻烦,而且不能定向刷新,比如不更新全部只更新某几个节点的配置信息,这样就很麻烦,需要每一个都执行一遍POST请求。因此,为了满足以上需求需要Bus与Config进行结合使用 作用:利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化
1. 概述
Bus支持两种消息代理:
RabbitMQ
和kafka
1.1 什么是总线
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个公用的消息主题,并让系统中的所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他链接在该主题上的实例都知道的消息。
1.2 基本原理
ConfigClient实例都监听MQ中的同一个topic(默认topic是
**SpringCloudBus**
)。当一个服务刷新数据的时候,它会把这个信息放入到topic中,这样其它监听同一个topic的服务就能得到通知,然后去更新自身的配置。
2. 两种动态刷新设计思想
2.1 客户端触发
利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置 缺点:
- 打破了微服务的职责单一性,因为微服务本身是业务模块,它不应该承担配置刷新的职责
- 打破了微服务各个节点的对等性
- 有一定的局限性。例如:微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的的修改
2.2 服务端触发(掌握)
利用消息总线触发一个服务端ConfigServer的
/bus/refresh
端点,而刷新所有客户端的配置
3. 动态刷新全局广播案例(使用第二种设计思想—-服务端触发)
3.1 动态刷新工作流程
3.2 服务端
3.2.1 依赖
添加消息总线RabbitMQ支持
<!--添加消息总线RabbitMQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
3.2.2 YAML配置
增加rabbitmq相关配置
#rabbitmq相关配置
rabbitmq:
host: localhost
port: 15672
username: guest
password: guest
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
3.3 客户端
3.3.1 依赖
添加消息总线RabbitMQ支持
<!--添加消息总线RabbitMQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
3.3.2 YAML配置
增加rabbitmq相关配置
#rabbitmq相关配置
rabbitmq:
host: localhost
port: 15672
username: guest
password: guest
3.3 测试
- 码云上修改config-dev.xml配置文件然后提交
- 给服务端config-server发送POST请求,统一生效
curl -X POST "http://localhost:3344/actuator/bus-refresh"
- 3355和3366拉取成功,一次修改,广播通知,处处生效
4. 动态刷新定点通知案例
当需要只有某些微服务实例拉取最新配置时使用
4.1 公式
# 公式:
# http://lcoalhost:配置中心的端口号/actuator/bus-refresh/{destination}
# ex:只通知3355实例,不通知3366实例
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"