技巧!Spring Boot 动态刷新及实时监控配置文件的变化

文摘   科技   2025-01-24 08:01   新疆  

Spring Boot 3实战案例合集》现已囊括超过80篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

【重磅发布】《Spring Boot 3实战案例锦集》PDF电子书现已出炉!

🎉🎉我们精心打造的《Spring Boot 3实战案例锦集》PDF电子书现已正式完成,目前已经有80个案例,后续还将继续更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。这意味着,随着技术的不断发展和Spring Boot 3的深入应用,我们的电子书也将持续更新,确保您始终掌握最前沿、最实用的技术知识。

💌💌如何获取
请立即订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

现在就订阅合集


环境:SpringBoot2.7.18 + SpringCloud
2021.0.7



1. 简介

在Spring Cloud微服务架构中,配置管理是至关重要的。随着业务的发展和服务的不断扩展,配置信息经常需要调整。如何动态地获取这些变化,使服务能够实时响应配置的更新,成为了关键问题。Spring Cloud提供了多种机制来实现配置的动态更新,使得开发人员能够轻松地管理和应用这些变化。

本篇文章不会结合Nacos讲解,将通过其它的方式手动的刷新配置及监听配置文件的变化。

2. 实战案例

2.1 依赖管理

<spring-cloud.version>2021.0.7</spring-cloud.version><dependencyManagement>  <dependencies>    <dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-dependencies</artifactId>      <version>${spring-cloud.version}</version>      <type>pom</type>      <scope>import</scope>    </dependency>  </dependencies></dependencyManagement>

项目中主要是需要引入spring-cloud-context包,所以你可以根据需要随便引入openfeign或者loadbalancer相应的包即可,只要环境中存在spring-cloud-context包就行了。本示例引入的是:

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

该依赖中会自动引入commons和context。

2.2 开启bootstrap配置

要启动bootstrap配置(也就是默认的bootstrap.yml配置生效)有以下2中方式:

第一种:

引入下面依赖

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

第二种:

启动应用程序时添加如下参数

-Dspring.cloud.bootstrap.enabled=true


bootstrap.yml配置文件生效关键是BootstrapApplicationListener
监听器。

部分代码

public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {  ConfigurableEnvironment environment = event.getEnvironment();  if (!bootstrapEnabled(environment) && !useLegacyProcessing(environment)) {    return;  }  // ...}

推荐第一种方式。

2.3 初始配置

bootstrap.yml配置内容如下

pack:  name: ooxx 

对应的属性配置类

@Component("pp")@ConfigurationProperties(prefix = "pack")public class PackProperties {  private String name ;  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  }

测试接口

@RestController@RequestMapping("/pack")public class PackController {  @Resource(name = "pp")  private PackProperties props ;  @GetMapping("")  public PackProperties p() {    return props ;  }}

正确显示配置信息。

如果你修改配置文件pack.name默认情况下是不会有任何变化的。要正确的使得配置文件实时更新,我们可以手动的触发配置刷新动作。

触发刷新动作

@Resourceprivate ContextRefresher contextRefresher ;@GetMapping("/refresh")public Object refresh() {  return this.contextRefresher.refresh() ;}

通过ContextRefresher#refresh方法会触发2个核心动作:

  1. 重新初始化refresh作用域的bean对象

  2. @ConfigurationProperties注解的类(或方法@Bean)会重新初始化

    触发EnvironmentChangeEvent事件。


修改配置文件内容如下:

pack:  name: ooxx

调用上面/refresh接口后,无需重启服务,配置信息已经动态刷新


上面的示例是需要对@ConfigurationProperties进行重写绑定,所以我们可以通过监听EnvironmentChangeEvent事件在程序中监听配置的变化。

@Componentpublic class PackApplicationEventListener implements ApplicationListener<EnvironmentChangeEvent> {
@Resource private Environment env ;
@Override public void onApplicationEvent(EnvironmentChangeEvent event) { System.out.println(event.getKeys()) ; System.out.println(env.getProperty("pack.name")) ;  }}

当配置发生变化后,上面的监听程序将被触发。

控制台输出

[pack.name]xxxooo

以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

强大!基于Map优化缓存设计

强大!SQL解析神器JSQLParser

高级开发!性能优化,Spring Boot 不使用AOP也能优雅的记录日志

强大!Spring Boot 通过责任链模式实现服务的动态编排

高级开发!Spring Boot 定制化请求参数和响应格式

优雅!Spring强大的数据绑定功能,太爽了

优雅!Spring Boot 这样记录操作日志非常灵活强大

Java中的七种函数式编程技巧

性能提升!@Async与CompletableFuture优雅应用

我100%确定,你对@ComponentScan注解的了解仅限于皮毛


Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章