首页 > 其他分享 >结合Spring Cloud Bus实现配置动态刷新

结合Spring Cloud Bus实现配置动态刷新

时间:2022-12-14 19:22:21浏览次数:44  
标签:配置 Spring 刷新 Bean RefreshScope Bus Cloud

在上一节中我们学习了在Spring Cloud微服务系统架构中使用Config Server进行本地仓库配置读取和线上环境的远程仓库git配置读取,让我们在多个微服务下也可以进行配置信息的集中管理。但是还有一个问题,那就是Config Server从git读取配置文件是项目启动的时候进行的,如果项目启动后我们修改了配置信息,那么服务还是使用原来的配置信息,想要修改的配置即时生效我们还需要重启服务项目进行手动刷新。为了解决这个问题,Spring Cloud提供了一些解决方式,例如,提供@RefreshScope注解可以实现配置修改之后自动刷新、提供Spring Cloud Bus消息总线配合Config Server进行多端配置的自动刷新。下面我们就来看看如何在Spring Cloud系统中实现配置的自动刷新。

 

1. 使用@RefreshScope实现配置刷新 在使用@RefreshScope之前我们先了解下这个注解。

对于@RefreshScope注解,官方是这样解释的:在被此注解修饰的范围中的所有Bean仅在首次访问时初始化,因此该范围强制使用延迟初始化(延迟加载)。

这个注解会为涉及作用域中的每个Bean创建一个代理对象。

如果一个Bean被刷新,那么下次访问该Bean(即执行一个方法)时,就会创建一个新实例。

所有生命周期方法都应用于Bean实例,因此在刷新时会调用在Bean工厂的销毁回调方法,然后在创建新实例时正常调用初始化回调,新的Bean实例是根据原始Bean定义创建的,因此任何外部化的内容(属性占位符或字符串文本中的表达式)在创建时都会重新计算。

上面的描述说明了该注解的工作原理,具体实现配置自动刷新的代码参考RefreshScope类、GenericScope类以及Scope接口的代码即可,这里就不展示了。

 

在Spring Cloud 2.0之前,我们只需要加入Actuator依赖,然后在使用的地方加上@RefreshScope注解就可以使用Spring Cloud 暴露的接口“/refresh”来刷新配置。

但是Spring Cloud 2.0之后,需要我们主动暴露Actuator的端点才可以。

接下来我们通过一个案例来使用@RefreshScope,具体步骤如下。

① 在服务config-client的pom.xml文件中加入Actuator依赖,如程序清单14-10所示。

 

 

并在使用配置的地方添加@RefreshScope注解,如程序清单14-11所示。

 

 

② 在application.yml或bootstrap.yml中,暴露Actuator的“refresh”端点信息,如程序清单14-12所示。

 

 

 

③ 进行测试。我们依次启动项目eureka-server、config-server、config-client。先在浏览器中访问“http://localhost:7031/config/getVersion”,查看配置信息,如图所示。

 

 

然后在远程git上修改配置信息mylog的version为V3.0.0,并通过Postman等工具使用POST请求访问“/actuator/refresh”,如图所示。

 

 

我们再次在浏览器中访问“http://localhost:7031/config/getVersion”,可以发现配置信息已经更新,如图所示。

然后在远程git上修改配置信息mylog的version为V3.0.0,并通过Postman等工具使用POST请求访问“/actuator/refresh”,如图所示。

 

然后在远程git上修改配置信息mylog的version为V3.0.0,并通过Postman等工具使用POST请求访问“/actuator/refresh”,如图所示。

 

 

 

我们发现使用@RefreshScope注解之后,不需要重启项目就可以从git获取最新配置,但是目前还是存在两个问题。

问题一:需要我们使用Postman等工具手动调用POST请求接口“/actuator/refresh”才能刷新配置。

问题二:每次调用/actuator/refresh接口只能通知一个Config Client进行刷新,要刷新所有的Config Client就需要一个一个地调用。

 

问题一的解决方法:手动调用接口来刷新的问题,我们可以很容易地解决,因为不管是开源的GitHub和Gitee还是自建的GitLab都提供了“WebHook”功能。

WebHook可以在我们修改git的文件的时候触发一个行为帮我们调用一个接口,这样就很好地解决了手动刷新的问题。

 

标签:配置,Spring,刷新,Bean,RefreshScope,Bus,Cloud
From: https://www.cnblogs.com/cnetsa/p/16983003.html

相关文章

  • spring boot+ nginx 搭建简单的文件服务器,实现上传下载
    项目中用的文件服务的上传和下载访问的问题,由于疫情没有办法接入大的分布式是文件服务器中,自己就动手搭建一个文件服务器来nginx+springboot。实现的主要思路如下:springb......
  • spring boot + Redis实现消息队列-生产消费者
    实现思路:Redis本身提供了一个发布/订阅模式,但生产消费者模式需要我们自己去实现。利用Redis中的队列,将新消息放入名称为xx的队列末尾,完成消息生产者。启动一个线程,使用​​b......
  • SpringBoot 设置动态定时任务
    前言SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,不是太灵活,改文章是主要是实现在固定的......
  • spring boot 实现Mysql数据脚本导出和数据库脚本的导入
    前言在开发过程中这样一个需求,有些数据需要从数据库导出,然后导入到另外的数据库中。数据导出@SneakyThrowspublicStringexport(){//获取数据库连接对象......
  • 【Java】Spring Cache 缓存
    SpringCache一、Spring缓存抽象Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;并支......
  • Spring Integration的网络通量支持
    WebFluxSpring集成模块()允许以反应方式执行HTTP请求和处理入站HTTP请求。​​spring-integration-webflux​​您需要将此依赖项包含在项目中:<dependency><groupI......
  • SpringMVC学习
    SpringMVC学习1.回顾MVC1.1什么是MVCMVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码......
  • spring mvc环境之异常错误码的统一返回(十五)
    1.根据不同的请求方式,返回页面或json数据1).创建统一权限异常处理类,所有的权限异常走一个端口2).根据请求方式不同返回不同数据,页面请求返回403未授权页面,ajax请......
  • spring学习-1.使用Maven构建spring项目
    1.新建一个Maven项目​​​​​​项目的结构图​​​​2.配置pom.xml,引入项目需要的依赖,这里引入了spring,junit<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns......
  • Maven构建spring整合mybatis的项目
    1.使用Maven构建java项目,修改pom.xml文件,添加所需的依赖jar包<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:......