《Spring Boot 3实战案例合集》现已囊括超过80篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。
【重磅发布】《Spring Boot 3实战案例锦集》PDF电子书现已出炉!
🎉🎉我们精心打造的《Spring Boot 3实战案例锦集》PDF电子书现已正式完成,目前已经有80个案例,后续还将继续更新。文末有电子书目录。
💪💪永久更新承诺:
我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。这意味着,随着技术的不断发展和Spring Boot 3的深入应用,我们的电子书也将持续更新,确保您始终掌握最前沿、最实用的技术知识。
💌💌如何获取:
请立即订阅我们的合集《点我订阅》,并通过私信联系我们,我们将第一时间将电子书发送给您。
环境:SpringBoot2.7.18 + SpringCloud2021.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
对应的属性配置类
public class PackProperties {
private String name ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试接口
public class PackController {
private PackProperties props ;
public PackProperties p() {
return props ;
}
}
正确显示配置信息。
如果你修改配置文件pack.name默认情况下是不会有任何变化的。要正确的使得配置文件实时更新,我们可以手动的触发配置刷新动作。
触发刷新动作
@Resource
private ContextRefresher contextRefresher ;
@GetMapping("/refresh")
public Object refresh() {
return this.contextRefresher.refresh() ;
}
通过ContextRefresher#refresh方法会触发2个核心动作:
重新初始化refresh作用域的bean对象
@ConfigurationProperties注解的类(或方法@Bean)会重新初始化
触发EnvironmentChangeEvent事件。
修改配置文件内容如下:
pack:
name: ooxx
调用上面/refresh接口后,无需重启服务,配置信息已经动态刷新
上面的示例是需要对@ConfigurationProperties进行重写绑定,所以我们可以通过监听EnvironmentChangeEvent事件在程序中监听配置的变化。
@Component
public 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
以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏
推荐文章
高级开发!性能优化,Spring Boot 不使用AOP也能优雅的记录日志
强大!Spring Boot 通过责任链模式实现服务的动态编排
性能提升!@Async与CompletableFuture优雅应用
我100%确定,你对@ComponentScan注解的了解仅限于皮毛