Version: Next

全局广播动态刷新

全局广播设计思想

  1. 利用消息总线触发一个 Config Client 的 /bus/refresh,从而刷新所有 Config Client 的配置
  2. 利用消息总线触发一个服务端 Config Server 的 /bus/refresh ,从而刷新所有 Config Client 的配置
  3. 触发服务端 Config Server 的方式比较好,因为触发一个 Config Client模式 具有以下缺点
    1. 打破了微服务的职责单一性
    2. 破坏了微服务各节点的对等性
    3. 有一定局限性,微服务迁移时,许多配置如网络地址会发生变化

改造 Config Server 3344

改造 cloud-config-center-3344 配置中心 服务端 添加消息总线支持

POM

添加 starter-bus-amqp RabbitMQ 依赖

<!-- 添加消息总线RabbitMQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

YAML

  • 增加 RabbitMQ 设置
  • 增加暴露 bus 刷新配置端点设置
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
#uri: git@gitee.com:ceskykrumlov/springcloud-config.git # ssh方式,不支持openssh
uri: https://gitee.com/ceskykrumlov/springcloud-config.git
##搜索目录.这个目录指的是github上的目录
username: banbanzhichinimen@qq.com # 你的github / gitee 账户 配合 https,ssh方式不需要
password: 680721sx # 你的 github/gitee 密码 配合 https,ssh方式不需要
search-paths:
- sprincloud-config
##读取分支
label: master
#rabbit相关配置 15672是web管理界面的端口,5672是MQ访问的端口
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
#rabbitmq相关设置 ,暴露 bus刷新配置的端点 actuator
management:
endpoints:
web:
exposure:
include: 'bus-refresh'

新建 Config Client 3366

参照 3355 创建一个 3366

  • POM、bootstrap.yml、主启动类、Controller 都来一份
  • Controller 方法响应的字符串中,可以加上端口号,用来区分

改造两个 Config Client

  • 33553366 的 pom 都添加 RabbitMQ Maven 依赖
  • 33553366 都修改 bootstrap.yml 添加 RabbitMq 配置
server:
port: 3355
spring:
application:
name: config-client
cloud:
#Config客户端配置
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上诉3个综合就是 master分支上 config-dev.yml
uri: http://localhost:3344 # spring cloud config server uri
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
#暴露 actuator 监控端点 让配置修改可以被监控
management:
endpoints:
web:
exposure:
include: "*"

测试

  • 启动注册中心 7001
  • 启动配置中心服务端 3344
  • 启动配置客户端 33553366
  • Github / Gitee 上修改远程配置文件 config-dev.yml 把版本号 version 改个值,提交 (这里我原先是 5,改成 12
  • 先查看一次值
    • http://config-3344.com:3344/master/config-dev.yaml 查出来是 12
    • localhost:3355/configInfo 查出来是 5
    • localhost:3366/configInfo 查出来是 5
  • 使用 POST 请求配置中心服务端,进行刷新 curl -X POST "http://localhost:3344/actuator/bus-refresh" ,此处的 path /bus-refresh 就是配置在 3344 yml 中暴露的地址
  • 再查看一次值
    • http://config-3344.com:3344/master/config-dev.yaml 查出来是 12
    • localhost:3355/configInfo 查出来是 12
      响应 3355: master branch,springcloud-config/config-dev.yml version=12
    • localhost:3366/configInfo 查出来是 12
      响应 3366: master branch,springcloud-config/config-dev.yml version=12
  • 实现一次修改,广播通知,处处生效:只需要刷一下 3344,剩下的 33553366 通过 BUS 自动就刷新了

微服务定点通知

需求场景:只想更改 3355,不想修改 3366

  • 使用公式 http://localhost:3344/actuator/bus-refresh/{destination}
  • /bus-refresh 请求不再发送到具体的微服务实例上,而是发送给 config server 3344,通过 destination 参数指定需要更新配置的服务或实例
  • 例:只想更改 3355,不想修改 3366
    • 使用 POST 请求:curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
    • /config-client:3355 是由 3355 微服务的 YAML 配置文件中的 spring.application.name 属性 + server.port 端口号 组成的