存在一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,就不得不修改Webhook 的配置。
服务端发起通知点击链接观看:服务端发起通知视频(获取更多请关注公众号「哈喽沃德先生」)
为了解决客户端发起通知缺陷,我们改用服务端发起通知。
Webhook监听被触发,给 ConfigServer 发送 bus-refresh 请求刷新配置
ConfigServer 发送消息给 Bus
Bus 接收消息后广播通知所有 ConfigClient
各 ConfigClient 收到消息重新读取最新配置
添加依赖Config Server 添加 spring cloud starter bus amqp 依赖。
<!-- 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 缓存重新绑定属性。
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 自动刷新端点。
访问::9091/name 和 :9092/name 结果如下:
修改 Git 仓库配置修改 Git 仓库配置信息如下:
# 自定义配置 name: order-service-prod-2.0 自动刷新刷新页面发现结果并未改变,没事正常。
通过 Post 方式调用「任意服务端」的自动刷新端点::8888/actuator/bus-refresh 再次访问结果如下:
查看队列再来观察一下消息队列的 UI 界面,发现多了一个 springCloudBus 的交换机。
该交换机下绑定了四个队列对应我们的两个 Config Server 和两个 Config Client。
局部刷新假设有这样一种场景,我们开发了一个新的功能,此时需要对该功能进行测试。我们只希望其中一个微服务的配置被更新,等功能测试完毕,正式部署线上时再更新至整个集群。但是由于所有微服务都受 Spring Cloud Bus 的控制,我们更新了其中一个微服务的配置,就会导致其他服务也被通知去更新配置。这时候局部刷新的作用就体现出来了。
刷新指定服务修改 Git 仓库配置信息如下:
# 自定义配置 name: order-service-prod-3.0通过 Post 方式调用「任意服务端」的自动刷新端点::8888/actuator/bus-refresh/order-service:9091 再次访问结果如下:
9091 端口的客户端已经更新配置。
9092 端口的客户端没有更新配置。
刷新指定集群假设现在功能测试完毕,需要正式部署线上更新至整个集群。但是由于 Spring Cloud Bus 控制着多个微服务集群(订单微服务、商品微服务等),而我们只想更新指定集群下的配置,这个时候就可以使用 Bus 提供的通配符更新方案。
修改 Git 仓库配置信息如下:
# 自定义配置 name: order-service-prod-4.0通过 Post 方式调用「任意服务端」的自动刷新端点::8888/actuator/bus-refresh/order-service:** 再次访问结果如下: