Nacos作為配置中心注冊監(jiān)聽器方法
前言
本文主要討論Nacos作為配置中心時,其中配置內(nèi)容發(fā)生更改時,我們的應(yīng)用程序能夠做的事。
一般使用監(jiān)聽器來實現(xiàn)這步操作。
對應(yīng)的監(jiān)聽器接口是:com.alibaba.nacos.api.config.listener.Listener
接下來看看如何注冊一個監(jiān)聽器。
項目文件說明
以下操作都是在 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 監(jiān)聽的dataId
nacos:
listener:
dataId:
- bussiness-param.json
- junzi-navigation.yml
NacosConfig配置類
主要是讀取配置內(nèi)容,生成類 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;
}
}
監(jiān)聽器實現(xiàn)類-默認實現(xiàn)
監(jiān)聽到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)聽器
*
* @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)聽器實現(xiàn)類-json配置處理
在Nacos中增加配置:

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

點擊發(fā)布后,控制臺會輸出內(nèi)容:
o.f.n.l.JsonFileNacosConfigListener.receiveConfigInfo(JsonFileNacosConfigListener.java:37) : ![method=default,businessId=default] 將Nacos配置的json數(shù)據(jù)轉(zhuǎn)換為實例:JunZiNacosConfigListener.TestParse(code=666666, reason=作者真帥, success=false)
到此這篇關(guān)于Nacos作為配置中心注冊監(jiān)聽器方法的文章就介紹到這了,更多相關(guān)Nacos注冊監(jiān)聽器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決SpringBoot的@DeleteMapping注解的方法不被調(diào)用問題
這篇文章主要介紹了解決SpringBoot的@DeleteMapping注解的方法不被調(diào)用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
Java使用DOM4j實現(xiàn)讀寫XML文件的屬性和元素
這篇文章主要為大家詳細介紹了Java使用DOM4j實現(xiàn)讀寫XML文件的屬性和元素,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
Java Semaphore實現(xiàn)高并發(fā)場景下的流量控制
在java開發(fā)的工作中是否會出現(xiàn)這樣的場景,你需要實現(xiàn)一些異步運行的任務(wù),該任務(wù)可能存在消耗大量內(nèi)存的情況,所以需要對任務(wù)進行并發(fā)控制。本文將介紹通過Semaphore類優(yōu)雅的實現(xiàn)并發(fā)控制,感興趣的可以了解一下2021-12-12
SpringBoot 統(tǒng)一請求返回的實現(xiàn)
這篇文章主要介紹了SpringBoot 統(tǒng)一請求返回的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07

