springcloud通用的config配置刷新

手动刷新单客户端

在config-client中添加:
Spring Cloud Config中手动刷新配置的端点:/actuator/refresh
Server连接的远程数据库(如gitee或github)中配置文件进行了动态修改,Client通过手动刷新端点获取新的配置属性值。具体步骤如下:

依赖
Client应用程序中添加actuator依赖,从而可以使用actuator下的端点。

org.springframework.boot spring-boot-starter-actuator

actuator下添加refresh端点
由于actuator下默认端点时health和info,没有refresh端点,以此需要添加该端点。在application.properties(或.yml)文件中,添加如下代码:

management:
  endpoints: 
    web: 
      exposure:
        include: health, info, refresh

使用refrehs端点
curl -X POST http://localhost:8081/actuator/refresh,刷新从Server中获取配置文件的属性值。

自动刷新服务及客户端

SpringCloud Config Bus
上述的示例中,我们客户端发现每次获取最新配置都需要手动进行刷新,如果少的的话还可以使用,但是多的话就比较繁琐了,虽然我们可以使用类似Github的WebHook的工具。

WebHook是当某个事件发生时,通过发送http post请求的方式来通知信息接收方。

但是当客户端越来越多的时候WebHook已经不好使用了,每次新增客户端都需要更改WebHook会显得很麻烦,springcloud官方给出了非常好的解决方案,Spring Cloud Bus。

Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中。

为什么使用Spring Cloud Bus就可以解决这个问题了呢?
我们不一定非要透彻的理解其原理才可以知道,我们只需要知道它的实现步骤,就可以知道了为什么可以解决了。
步骤如下:

首先,在配置中进行更新配置文件信息,它就会自动触发post发送bus/refresh;
然后服务端就会将更新的配置并且发送给Spring Cloud Bus;
继而Spring Cloud bus接到消息之后并通知给使用该配置的客户端;
最后使用该配置的客户端收到通知后,就会获取最新的配置进行更新;
这里我也简单的画了下使用Spring Cloud Bus之前和之后的流程图,方便进行理解。

主要是增加bus组件,在服务端和客户端都要

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>

然后在application配置中添加这些配置,在服务端和客户端都要

management.endpoints.web.exposure.include= bus-refresh #这个配置不需要在客户端添加,因为目前已经可以在服务端进行所有的客户端刷新了
spring.cloud.bus.enabled = true
spring.cloud.bus.trace.enabled = true

上述配置好了可以运行服务端加/actuator/bus-refresh进行全局刷新

完成上述全局刷新测试之后,有时我们只想刷新部分微服务的配置,那么便可以使用/actuator/bus-refresh/{destination}端点的 destination 参数来定位要刷新的应用程序。(destination就是你自己定义的application.name)


springcloud通用的config配置刷新
https://blog.jeecloud.cn/2021/01/07/20210108073700/
作者
pshgao
发布于
2021年1月8日
许可协议