Nacos作為配置中心注冊(cè)監(jiān)聽(tīng)器方法
前言
本文主要討論Nacos作為配置中心時(shí),其中配置內(nèi)容發(fā)生更改時(shí),我們的應(yīng)用程序能夠做的事。
一般使用監(jiān)聽(tīng)器來(lái)實(shí)現(xiàn)這步操作。
對(duì)應(yīng)的監(jiān)聽(tīng)器接口是:com.alibaba.nacos.api.config.listener.Listener
接下來(lái)看看如何注冊(cè)一個(gè)監(jiān)聽(tīng)器。
項(xiàng)目文件說(shuō)明
以下操作都是在 SpringBoot項(xiàng)目中。以下是部分代碼,完整代碼請(qǐng)?jiān)L問(wèn)代碼倉(cāng)庫(kù):
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 監(jiān)聽(tīng)的dataId
nacos:
listener:
dataId:
- bussiness-param.json
- junzi-navigation.yml
NacosConfig配置類
主要是讀取配置內(nèi)容,生成類 com.alibaba.nacos.api.config.ConfigService的實(shí)例。
讀取的是 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配置出錯(cuò) {}", e.getMessage());
return null;
}
return configServiceInstance;
}
}
監(jiān)聽(tīng)器實(shí)現(xiàn)類-默認(rèn)實(shí)現(xiàn)
監(jiān)聽(tīng)到Nacos內(nèi)容發(fā)生更改,只打印日志。
package org.feng.navigation.listener;
import com.alibaba.nacos.api.config.listener.Listener;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Executor;
/**
* Nacos 監(jiān)聽(tīng)器
*
* @version V1.0
*/
@Slf4j
public class DefaultNacosConfigListener implements Listener {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
log.info("Nacos配置內(nèi)容發(fā)生更改:{}", configInfo);
}
}
監(jiān)聽(tīng)器實(shí)現(xiàn)類-json配置處理
在Nacos中增加配置:

內(nèi)容是一個(gè)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 監(jiān)聽(tīng)json數(shù)據(jù)
*
* @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配置錯(cuò)誤,當(dāng)前配置不是一個(gè)有效的JSON");
return;
}
T instance = GsonUtil.fromJson(configInfo, instanceClass);
log.info("將Nacos配置的json數(shù)據(jù)轉(zhuǎn)換為實(shí)例:{}", instance);
}
}
監(jiān)聽(tīng)JSON配置,可以用來(lái)做一些業(yè)務(wù)實(shí)現(xiàn)。我這里暫是只將其序列化成某個(gè)類的實(shí)例。然后輸出日志,別的沒(méi)做。
真實(shí)業(yè)務(wù)場(chǎng)景,可以定制化一個(gè)這樣的類,來(lái)做你自己的業(yè)務(wù)。
注冊(cè)監(jiān)聽(tīng)器
通過(guò)配置datId來(lái)注冊(cè)對(duì)應(yīng)的監(jiān)聽(tīng)器:
# nacos 監(jiān)聽(tīng)的dataId
nacos:
listener:
dataId:
- bussiness-param.json
- junzi-navigation.yml
這里通過(guò)dataId的后綴,識(shí)別到是哪種配置,然后注冊(cè)不同的監(jiān)聽(tīng)器,用以實(shí)現(xiàn)不同的處理。
目前監(jiān)聽(tīng)到 yml 配置,只輸出日志,使用默認(rèn)監(jiān)聽(tīng)器。
監(jiān)聽(tīng)到 json 內(nèi)容,會(huì)校驗(yàn)是不是一個(gè)有效的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配置監(jiān)聽(tīng)器
*
* @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("正在監(jiān)聽(tīng) 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;
}
}監(jiān)聽(tīng)器的效果
啟動(dòng)項(xiàng)目后,修改 bussiness-param.json 配置的內(nèi)容:

點(diǎn)擊發(fā)布后,控制臺(tái)會(huì)輸出內(nèi)容:
o.f.n.l.JsonFileNacosConfigListener.receiveConfigInfo(JsonFileNacosConfigListener.java:37) : ![method=default,businessId=default] 將Nacos配置的json數(shù)據(jù)轉(zhuǎn)換為實(shí)例:JunZiNacosConfigListener.TestParse(code=666666, reason=作者真帥, success=false)
到此這篇關(guān)于Nacos作為配置中心注冊(cè)監(jiān)聽(tīng)器方法的文章就介紹到這了,更多相關(guān)Nacos注冊(cè)監(jiān)聽(tīng)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)本地存儲(chǔ)文件上傳及提供HTTP訪問(wèn)服務(wù)的方法
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)本地存儲(chǔ)文件上傳及提供HTTP訪問(wèn)服務(wù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
通過(guò)Java 程序獲取Word中指定圖片的坐標(biāo)位置
本文介紹通過(guò)Java程序獲取Word文檔中指定圖片的坐標(biāo)位置,程序運(yùn)行環(huán)境是jdk1.8開(kāi)發(fā)環(huán)境idea,通過(guò)java程序代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-05-05
java面試常問(wèn)的Runnable和Callable的區(qū)別
大家好,本篇文章主要講的是java面試常問(wèn)的Runnable和Callable的區(qū)別,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
Java編程實(shí)現(xiàn)游戲中的簡(jiǎn)單碰撞檢測(cè)功能示例
這篇文章主要介紹了Java編程中的簡(jiǎn)單碰撞檢測(cè)功能,涉及java針對(duì)坐標(biāo)點(diǎn)的相關(guān)數(shù)學(xué)運(yùn)算操作技巧,需要的朋友可以參考下2017-10-10
Java開(kāi)發(fā)學(xué)習(xí) Java數(shù)組操作工具
這篇文章主要為大家詳細(xì)介紹了自己編寫的Java數(shù)組操作工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04

