Spring Cloud全解析:配置中心之springCloudConfig使用消息总线进行动态刷新

使用消息总线进行动态刷新

Spring Cloud Bus是将分布式系统的节点与轻量级消息系统链接起来的框架,整合了java的时间处理机制和消息中间件功能,目前支持RabbitMQ和kafka,构建一个共用的消息主题,并让系统中所有的微服务实例都连接上来,该主题产生的消息会被所有实例监听和消费,所以被称为消息总线

动态刷新配置

ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus),当一个服务刷新数据时,会把这个信息放入到Topic中,这样其他监听同一Topic的服务就能得到通知,然后更新自身的配置

有两种实现方式

第一种

利用消息总线触发一个客户端/bus/refresh,从而刷新所有客户端的配置

第二种

利用消息总线触发Config服务端的/bus/refresh端点,从而刷新所有客户端的配置,选用该方式比较合适

现使用第二种方式进行配置消息总线动态刷新

配置中心服务端

在配置中心服务端增加依赖

xml 复制代码
<!-- 消息总线进行配置动态刷新 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

增加配置

我用的是kafka进行的传输,需要配置kafka配置

yml 复制代码
spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: test

消息总线需要触发/bus/refresh端点,需要暴露该端点

yml 复制代码
# 暴露bus刷新配置端点
management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'
配置客户端

客户端增加依赖

xml 复制代码
<!-- 消息总线进行配置动态刷新 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

客户端增加配置

yml 复制代码
spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: test
yml 复制代码
# 端点管理
management:
  endpoints:
    web:
      exposure:
        include: "*"  # 暴露端点,*表示全部暴露

配置被修改后,需要调用配置中心服务端的/bus/refresh端点来对所有的配置客户端进行配置刷新http://ip:port/actuator/bus-refresh ,使用post请求

如果想要定点配置刷新的话,可以指定某个实例

应用程序的每个实例都有一个服务ID,该服务ID的值可以用spring.cloud.bus.id设置,并且其值应按冒号分隔的标识符列表(从最小到最具体)排列。默认值是根据环境构造的,它是spring.application.nameserver.port(或spring.application.index,如果已设置)的组合。ID的默认值以app:index:id的形式构造,其中:

  • appvcap.application.name(如果存在),或者是spring.application.name
  • indexvcap.application.instance_index(如果存在),依次为spring.application.indexlocal.server.portserver.port0
  • idvcap.application.instance_id(如果存在)或随机值。

HTTP端点接受" 目的地 "路径参数,例如/bus-refresh?destination=customers:9000,其中destination`是服务ID。如果该ID由总线上的一个实例拥有,它将处理该消息,而所有其他实例将忽略它

如果想要自动刷新,可以配置git上的webHooks来触发http://ip:port/actuator/bus-refresh

https://zhhll.icu/2021/框架/微服务/springcloud/配置中心/springCloudConfig/3.使用消息总线进行动态刷新/

相关推荐
chuanauc几秒前
Kubernets K8s 学习
java·学习·kubernetes
一头生产的驴16 分钟前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao23 分钟前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc78727 分钟前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
YuTaoShao3 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张33 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
llwszx6 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野6 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person7 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜8 小时前
java异常学习
java