文章目录
- springboot nacos监听配置变化(监听指定DataId/监听任何变化)
- 监听任何配置变化
- Nacos注解
- @NacosConfigurationProperties
- @NacosValue
- @NacosConfigListener
- @NacosInjected
- NacosConfigService
- NacosNamingService
springboot nacos监听配置变化(监听指定DataId/监听任何变化)
监听任何配置变化
由于我写的这个是基础包-权限中需要监听某些配置,给路径白名单,方便发布后出问题能及时修复权限拦截问题,但是操作nacos时是操作项目所在nacos配置,因此无法在使用指定DataId这种方式去监听变化并实现加白逻辑,需要监听任何配置文件变化。
为方便大家拷贝代码,文章里多加了@Component,基础包采用@EnableXXX模式。
@Slf4j
@Component
public class AuthNacosConfigListener implements ApplicationListener<EnvironmentChangeEvent> {private final AuthConfigProperties authConfigProperties;public AuthNacosConfigListener(AuthConfigProperties authConfigProperties) {this.authConfigProperties = authConfigProperties;}/*** Handle an application event.** @param event the event to respond to*/@Overridepublic void onApplicationEvent(EnvironmentChangeEvent event) {log.info("监听到权限配置变更事件,刷新权限配置,当前配置为:{},系统变化事件:{}", JSONObject.toJSONString(authConfigProperties), JSONObject.toJSONString(event));}
}
有@ConfigurationProperties不需要加@RefreshScope也会自动刷新配置的
ConfigurationProperties是spring-context提供的注解,实现配置注入
RefreshScope是springcloud-context提供的注解,实现自动刷新
在nacos进行配置修改后
2024-07-18 13:59:43.321 INFO [] 28932 --- [71.85.126_30018] c.s.r.c.a.l.AuthNacosConfigListener : 监听到权限配置变更事件,刷新权限配置,当前配置为:{"excludePaths":["/abc"]},系统变化事件:{"keys":["common-auth.excludePaths[0]"],"timestamp":1721282383128}
Nacos注解
nacos所有注解
@NacosConfigurationProperties
这个注解是用在类上的,标明该类要注入nacos里的配置
@Data
@Configuration
@NacosConfigurationProperties(dataId = "xxx.yml", groupId = "XXX_GROUP", type = ConfigType.YAML, autoRefreshed = true)
public class AuthConfigProperties {/*** 排除的路径*/private List<String> excludePaths;
}
@NacosValue
nacos提供的注解,用于注入一个配置值,使用表达式定位。
@Value是spring提供的注解,注入值
@Data
@Configuration
public class AuthConfigProperties {/*** 排除的路径*/@NacosValue(value = "#{common-auth.excludePaths}", autoRefreshed = true)private List<String> excludePaths;
}
@NacosConfigListener
这个是用来监听某个dataId的配置发生变化的,发生变化时执行方法,并把最新值作为参数传入。
@NacosConfigListener(dataId = "xxx.yml", groupId = "XXX_GROUP", type = ConfigType.YAML)public void onChange(String content) {System.out.println("receive config change event, content:" + content);}
@NacosInjected
NacosConfigService
NacosNamingService
用于注入nacos的服务、注册中心服务
@NacosInjectedprivate NacosConfigService nacosConfigService;@NacosInjectedprivate NacosNamingService nacosNamingService;
nacosConfigService获取操作配置、注册移除监听器等操作
nacosNamingService 服务注册中心的操作