Spring Cloud 系列之 Bus 消息总线 (2)

存在一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,就不得不修改Webhook 的配置。

服务端发起通知

点击链接观看:服务端发起通知视频(获取更多请关注公众号「哈喽沃德先生」)

为了解决客户端发起通知缺陷,我们改用服务端发起通知。

Spring Cloud 系列之 Bus 消息总线

Webhook监听被触发,给 ConfigServer 发送 bus-refresh 请求刷新配置

ConfigServer 发送消息给 Bus

Bus 接收消息后广播通知所有 ConfigClient

各 ConfigClient 收到消息重新读取最新配置

添加依赖

Config Server 添加 spring cloud starter bus amqp 依赖。

Spring Cloud 系列之 Bus 消息总线

<!-- spring cloud starter bus amqp 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> 配置文件

配置文件需要配置 消息队列 和 bus-refresh 自动刷新端点。/actuator/bus-refresh 端点会清除 @RefreshScope 缓存重新绑定属性。

Spring Cloud 系列之 Bus 消息总线

Config Server 的 application.yml 核心配置。

spring: application: name: config-server # 应用名称 cloud: config: server: git: uri: https://github.com/imrhelloworld/config-repo # 配置文件所在仓库地址 #username: # Github 等产品的登录账号 #password: # Github 等产品的登录密码 #default-label: master # 配置文件分支 #search-paths: # 配置文件所在根目录 # 消息队列 rabbitmq: host: 192.168.10.101 port: 5672 username: guest password: guest virtual-host: / # 配置 Eureka Server 注册中心 eureka: instance: prefer-ip-address: true # 是否使用 ip 地址注册 instance-id: ${spring.cloud.client.ip-address}:${server.port} # ip:port client: service-url: # 设置服务注册中心地址 defaultZone: :8761/eureka/,:8762/eureka/ # 度量指标监控与健康检查 management: endpoints: web: base-path: /actuator # 访问端点根路径,默认为 /actuator exposure: include: bus-refresh # 需要开启的端点 #exclude: # 不需要开启的端点 测试 查看端点

访问::8888/actuator 可以看到已经开启了 bus-refresh 自动刷新端点。

Spring Cloud 系列之 Bus 消息总线

访问::9091/name 和 :9092/name 结果如下:

Spring Cloud 系列之 Bus 消息总线

Spring Cloud 系列之 Bus 消息总线

修改 Git 仓库配置

修改 Git 仓库配置信息如下:

# 自定义配置 name: order-service-prod-2.0 自动刷新

刷新页面发现结果并未改变,没事正常。

通过 Post 方式调用任意服务端的自动刷新端点::8888/actuator/bus-refresh 再次访问结果如下:

Spring Cloud 系列之 Bus 消息总线

Spring Cloud 系列之 Bus 消息总线

查看队列

再来观察一下消息队列的 UI 界面,发现多了一个 springCloudBus 的交换机。

Spring Cloud 系列之 Bus 消息总线

该交换机下绑定了四个队列对应我们的两个 Config Server 和两个 Config Client。

Spring Cloud 系列之 Bus 消息总线

局部刷新

假设有这样一种场景,我们开发了一个新的功能,此时需要对该功能进行测试。我们只希望其中一个微服务的配置被更新,等功能测试完毕,正式部署线上时再更新至整个集群。但是由于所有微服务都受 Spring Cloud Bus 的控制,我们更新了其中一个微服务的配置,就会导致其他服务也被通知去更新配置。这时候局部刷新的作用就体现出来了。

Spring Cloud 系列之 Bus 消息总线

刷新指定服务

修改 Git 仓库配置信息如下:

# 自定义配置 name: order-service-prod-3.0

通过 Post 方式调用任意服务端的自动刷新端点::8888/actuator/bus-refresh/order-service:9091 再次访问结果如下:

9091 端口的客户端已经更新配置。

Spring Cloud 系列之 Bus 消息总线

9092 端口的客户端没有更新配置。

Spring Cloud 系列之 Bus 消息总线

刷新指定集群

假设现在功能测试完毕,需要正式部署线上更新至整个集群。但是由于 Spring Cloud Bus 控制着多个微服务集群(订单微服务、商品微服务等),而我们只想更新指定集群下的配置,这个时候就可以使用 Bus 提供的通配符更新方案。

修改 Git 仓库配置信息如下:

# 自定义配置 name: order-service-prod-4.0

通过 Post 方式调用任意服务端的自动刷新端点::8888/actuator/bus-refresh/order-service:** 再次访问结果如下:

Spring Cloud 系列之 Bus 消息总线

Spring Cloud 系列之 Bus 消息总线

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwxzd.html