文章目录
1、实现方法
环境:Nacos、Java、SpringBoot等
主要是在boostrap.yaml
中的data-id
属性下配置refresh:true
来实现动态更新
2、配置依赖 + yaml
具体的版本参考官方的说明:官方版本说明
<!--读取bootstrap文件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--统一配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
boostrap.yaml 配置
spring:
application:
name: xxx-service # 微服务名称
profiles:
active: dev
cloud:
nacos:
server-addr: xxx.xxx.xxx.xxx:8848 # Nacos 地址
config:
namespace: xxxxxxxxxxxxxxxxxxx # 命名空间
file-extension: yaml
shared-configs:
- data-id: shared-common.yaml
refresh: true # 要开启刷新配置,下面的同理
- data-id: shared-redis.yaml
refresh: true
- data-id: shared-jdbc.yaml
refresh: true
- data-id: shared-log.yaml
refresh: true
- data-id: shared-swagger.yaml
refresh: true
- data-id: shared-sentinel.yaml
refresh: true
discovery:
namespace: xxxxxxxxxxxxxxxx # 命名空间
3、验证效果
配置监听,更新时打印配置到控制台
package com.lingchuangdao.creator.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.util.Set;
/**
* 监听配置变更事件,并打印所有变更的属性。
*/
@Component
@Slf4j
public class ConfigRefreshListener {
private final Environment environment;
public ConfigRefreshListener(Environment environment) {
this.environment = environment;
}
@EventListener
public void onEnvironmentChangeEvent(EnvironmentChangeEvent event) {
Set<String> keys = event.getKeys();
log.info("配置已更新,变更的属性数量: {}", keys.size());
// 打印所有变更的配置项
for (String key : keys) {
log.info("配置变更 - 属性: {}, 新值: {}", key, environment.getProperty(key));
}
}
@EventListener
public void onRefreshScopeRefreshed(RefreshScopeRefreshedEvent event) {
log.info("RefreshScope已刷新,Bean: {}", event.getName());
}
}
控制台输出: