Nacos作为配置中心注册监听器方法
你家宝宝 人气:0前言
本文主要讨论Nacos作为配置中心时,其中配置内容发生更改时,我们的应用程序能够做的事。
一般使用监听器来实现这步操作。
对应的监听器接口是:com.alibaba.nacos.api.config.listener.Listener
接下来看看如何注册一个监听器。
项目文件说明
以下操作都是在 SpringBoot项目中。以下是部分代码,完整代码请访问代码仓库:
https://gitee.com/fengsoshuai/junzi-navigation.git
pom依赖
<!-- Nacos读取配置--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2021.1</version> </dependency>
bootstrap.yml
spring:
cloud:
nacos:
# nacos配置
config:
username: nacos
password: nacos
server-addr: localhost:80
namespace: junzi# nacos 监听的dataId
nacos:
listener:
dataId:
- bussiness-param.json
- junzi-navigation.yml
NacosConfig配置类
主要是读取配置内容,生成类 com.alibaba.nacos.api.config.ConfigService
的实例。
读取的是 bootstrap.yml 中的连接nacos需要的属性字段。
package org.feng.navigation.config; import com.alibaba.cloud.nacos.NacosConfigProperties; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.PropertyKeyConst; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; import java.util.Properties; /** * Nacos 配置 * * @version V1.0 */ @Slf4j @Configuration public class NacosConfig { @Resource private NacosConfigProperties nacosConfigProperties; @Bean public ConfigService configService() { Properties properties = new Properties(); properties.setProperty(PropertyKeyConst.SERVER_ADDR, nacosConfigProperties.getServerAddr()); properties.setProperty(PropertyKeyConst.NAMESPACE, nacosConfigProperties.getNamespace()); properties.setProperty(PropertyKeyConst.USERNAME, nacosConfigProperties.getUsername()); properties.setProperty(PropertyKeyConst.PASSWORD, nacosConfigProperties.getPassword()); ConfigService configServiceInstance; try { configServiceInstance = NacosFactory.createConfigService(properties); } catch (NacosException e) { log.error("初始化Nacos配置出错 {}", e.getMessage()); return null; } return configServiceInstance; } }
监听器实现类-默认实现
监听到Nacos内容发生更改,只打印日志。
package org.feng.navigation.listener; import com.alibaba.nacos.api.config.listener.Listener; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.Executor; /** * Nacos 监听器 * * @version V1.0 */ @Slf4j public class DefaultNacosConfigListener implements Listener { @Override public Executor getExecutor() { return null; } @Override public void receiveConfigInfo(String configInfo) { log.info("Nacos配置内容发生更改:{}", configInfo); } }
监听器实现类-json配置处理
在Nacos中增加配置:
内容是一个json串:
package org.feng.navigation.listener; import com.alibaba.nacos.api.config.listener.Listener; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.feng.navigation.common.util.GsonUtil; import java.util.concurrent.Executor; /** * Nacos 监听json数据 * * @version V1.0 */ @Slf4j @AllArgsConstructor public class JsonFileNacosConfigListener<T> implements Listener { private Class<T> instanceClass; @Override public Executor getExecutor() { return null; } @Override public void receiveConfigInfo(String configInfo) { boolean isJson = GsonUtil.validateJson(configInfo); if (!isJson) { log.error("Nacos配置错误,当前配置不是一个有效的JSON"); return; } T instance = GsonUtil.fromJson(configInfo, instanceClass); log.info("将Nacos配置的json数据转换为实例:{}", instance); } }
监听JSON配置,可以用来做一些业务实现。我这里暂是只将其序列化成某个类的实例。然后输出日志,别的没做。
真实业务场景,可以定制化一个这样的类,来做你自己的业务。
注册监听器
通过配置datId来注册对应的监听器:
# nacos 监听的dataId
nacos:
listener:
dataId:
- bussiness-param.json
- junzi-navigation.yml
这里通过dataId的后缀,识别到是哪种配置,然后注册不同的监听器,用以实现不同的处理。
目前监听到 yml 配置,只输出日志,使用默认监听器。
监听到 json 内容,会校验是不是一个有效的json文件,然后将其序列化。
package org.feng.navigation.listener; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.List; /** * 菌子Nacos配置监听器 * * @version V1.0 */ @Data @Slf4j @Configuration public class JunZiNacosConfigListener { @Resource NacosConfigListenerProperties nacosConfigListenerProperties; private static final String GROUP = "junzi"; @Resource private ConfigService configService; @PostConstruct private void init() throws NacosException { List<String> dataIdList = nacosConfigListenerProperties.getDataId(); log.info("正在监听 group=junzi, nacos.listener.dataId={}", dataIdList); for (String dataId : dataIdList) { if (dataId.endsWith("yml")) { configService.addListener(dataId, GROUP, new DefaultNacosConfigListener()); continue; } if (dataId.endsWith("json")) { configService.addListener(dataId, GROUP, new JsonFileNacosConfigListener<>(TestParse.class)); } } } @Data @ConfigurationProperties("nacos.listener") public static class NacosConfigListenerProperties { private List<String> dataId; } @Data public static class TestParse { private Long code; private String reason; private Boolean success; } }
监听器的效果
启动项目后,修改 bussiness-param.json 配置的内容:
点击发布后,控制台会输出内容:
o.f.n.l.JsonFileNacosConfigListener.receiveConfigInfo(JsonFileNacosConfigListener.java:37) : ![method=default,businessId=default] 将Nacos配置的json数据转换为实例:JunZiNacosConfigListener.TestParse(code=666666, reason=作者真帅, success=false)
加载全部内容