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