Nacos作為配置中心注冊(cè)監(jiān)聽器方法
前言
本文主要討論Nacos作為配置中心時(shí),其中配置內(nèi)容發(fā)生更改時(shí),我們的應(yīng)用程序能夠做的事。
一般使用監(jiān)聽器來實(shí)現(xiàn)這步操作。
對(duì)應(yīng)的監(jiān)聽器接口是:com.alibaba.nacos.api.config.listener.Listener
接下來看看如何注冊(cè)一個(gè)監(jiān)聽器。
項(xiàng)目文件說明
以下操作都是在 SpringBoot項(xiàng)目中。以下是部分代碼,完整代碼請(qǐng)?jiān)L問代碼倉庫:
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
的實(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)聽器實(shí)現(xiàn)類-默認(rèn)實(shí)現(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)聽器實(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)聽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)聽JSON配置,可以用來做一些業(yè)務(wù)實(shí)現(xiàn)。我這里暫是只將其序列化成某個(gè)類的實(shí)例。然后輸出日志,別的沒做。
真實(shí)業(yè)務(wù)場(chǎng)景,可以定制化一個(gè)這樣的類,來做你自己的業(yè)務(wù)。
注冊(cè)監(jiān)聽器
通過配置datId來注冊(cè)對(duì)應(yīng)的監(jiān)聽器:
# nacos 監(jiān)聽的dataId
nacos:
listener:
dataId:
- bussiness-param.json
- junzi-navigation.yml
這里通過dataId的后綴,識(shí)別到是哪種配置,然后注冊(cè)不同的監(jiān)聽器,用以實(shí)現(xiàn)不同的處理。
目前監(jiān)聽到 yml 配置,只輸出日志,使用默認(rèn)監(jiān)聽器。
監(jiān)聽到 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)聽器 * * @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)聽器的效果
啟動(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)聽器方法的文章就介紹到這了,更多相關(guān)Nacos注冊(cè)監(jiān)聽器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決SpringBoot的@DeleteMapping注解的方法不被調(diào)用問題
這篇文章主要介紹了解決SpringBoot的@DeleteMapping注解的方法不被調(diào)用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Java使用DOM4j實(shí)現(xiàn)讀寫XML文件的屬性和元素
這篇文章主要為大家詳細(xì)介紹了Java使用DOM4j實(shí)現(xiàn)讀寫XML文件的屬性和元素,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Java Semaphore實(shí)現(xiàn)高并發(fā)場(chǎng)景下的流量控制
在java開發(fā)的工作中是否會(huì)出現(xiàn)這樣的場(chǎng)景,你需要實(shí)現(xiàn)一些異步運(yùn)行的任務(wù),該任務(wù)可能存在消耗大量?jī)?nèi)存的情況,所以需要對(duì)任務(wù)進(jìn)行并發(fā)控制。本文將介紹通過Semaphore類優(yōu)雅的實(shí)現(xiàn)并發(fā)控制,感興趣的可以了解一下2021-12-12Java的關(guān)鍵字與標(biāo)識(shí)符小結(jié)
這篇文章主要介紹了Java的關(guān)鍵字與標(biāo)識(shí)符,總結(jié)整理了Java各種常見的關(guān)鍵字與標(biāo)識(shí)符功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04SpringBoot 統(tǒng)一請(qǐng)求返回的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot 統(tǒng)一請(qǐng)求返回的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07idea如何自動(dòng)生成serialVersionUID
這篇文章主要介紹了idea如何自動(dòng)生成serialVersionUID,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02