本文用的是
Nacos作为配置中心注册监听器方法 实现热更新 nacos 配置文件
从而不用重启项目
依赖、工具类 这边就不写了
因为项目用的是 Json 类型的配置文件
所以下文 主要是对json文件进行实现
别的文件大同小异
先说扯淡的东西
{:width=400}
在nacos 的配置文件中
dataId 这两种声明 是不一样
虽然打开里面的配置信息都是 json格式
但是 dataId的命名不一样 我理解为 aaa 这种 等于你创建了一个没有后缀的配置文件
下面开始直接上实现代码
第一步 配置文件 :
# nacos 配置文件监听 参数
nacos:
listener:
dataId:
- systemConfig
第二步
package com.init.config.nacos;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
/**
* User:Json
* Date: 2024/3/28
* 获取 nacos上的文件名
**/
@Data
@Configuration
@ConfigurationProperties("nacos.listener")
public class DataIdConfig {
private List<String> dataId;
}
第三步
package com.init.config.nacos;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.api.constant.CommonConstant;
import com.api.response.nacos.SystemConfigNacos;
import com.init.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Properties;
import lombok.extern.slf4j.Slf4j;
/**
* User:Json
* Date: 2024/3/28
**/
@Slf4j
@Configuration
public class NacosInitConfig {
public static final long DEFAULT_TIMEOUT = 30000;
private ConfigService configService;
@Value("${spring.cloud.nacos.discovery.server-addr:}")
public String NACOS_SERVER_ADDR;
@Value("${spring.cloud.nacos.discovery.namespace:}")
public String NACOS_NAMESPACE;
@Resource
DataIdConfig nacosDataIdConfig;
@Value("${spring.cloud.nacos.discovery.group}")
public String NACOS_ROUTE_GROUP;
private static final String systemConfig="systemConfig";
private static final String linkLibrary="linkLibrary";
public void nacos(){
try {
configService = initConfigService();
if (configService == null) {
log.error("初始化Nacos 失败!");
return;
}
List<String> dataIdList = nacosDataIdConfig.getDataId();
for (String dataId : dataIdList) {
// if (dataId.endsWith("yml")) {
// configService.addListener(dataId, NACOS_ROUTE_GROUP, new YmlCallListener());
// }else if (dataId.endsWith("json")) {
// configService.addListener(dataId, NACOS_ROUTE_GROUP, new YmlCallListener());
// }else{
// configService.addListener(dataId,NACOS_ROUTE_GROUP, new YmlCallListener());
// }
switch (dataId){
case systemConfig:
String configInfo = configService.getConfig(dataId, NACOS_ROUTE_GROUP, DEFAULT_TIMEOUT);
// log.info("获取 systemConfig 配置文件:\r\n{}", configInfo);
if(StringUtils.isEmpty(configInfo)){
break;
}
SystemConfigNacos systemConfigNacos = JSON.parseObject(configInfo, SystemConfigNacos.class);
// System.out.println(systemConfigNacos.getJwtOrgKey());
if(!RedisUtils.hasKey(CommonConstant.REDIS_SYSTEM_CONFIG_NACOS_JAVA)){
RedisUtils.setString(CommonConstant.REDIS_SYSTEM_CONFIG_NACOS_JAVA,systemConfigNacos,-1);
}
configService.addListener(dataId,NACOS_ROUTE_GROUP, new JsonCallListener<>(SystemConfigNacos.class));
break;
case linkLibrary:
break;
}
}
} catch (Exception e) {
log.error("初始化 配置文件发生错误", e);
}
}
private ConfigService initConfigService() {
try {
Properties properties = new Properties();
properties.setProperty("serverAddr", NACOS_SERVER_ADDR);
properties.setProperty("namespace", NACOS_NAMESPACE);
return configService = NacosFactory.createConfigService(properties);
} catch (Exception e) {
log.error("初始化 Nacos 配置文件发生错误", e);
return null;
}
}
}
第四步:
package com.init.config.nacos;
import com.alibaba.fastjson.JSON;
import com.api.constant.CommonConstant;
import com.api.response.nacos.SystemConfigNacos;
import com.init.utils.RedisUtils;
import lombok.AllArgsConstructor;
import com.alibaba.nacos.api.config.listener.Listener;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Executor;
/**
* User:Json
* Date: 2024/3/28
**/
@Slf4j
@AllArgsConstructor
public class JsonCallListener<T> implements Listener {
private Class<T> instanceClass;
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
// log.info("nacos中的Json数据发生变化了:{}", configInfo);
T systemConfigNacos = JSON.parseObject(configInfo, instanceClass);
if(RedisUtils.hasKey(CommonConstant.REDIS_SYSTEM_CONFIG_NACOS_JAVA)){
RedisUtils.delete(CommonConstant.REDIS_SYSTEM_CONFIG_NACOS_JAVA);
}
RedisUtils.setString(CommonConstant.REDIS_SYSTEM_CONFIG_NACOS_JAVA,systemConfigNacos,-1);
}
}
package com.init.config.nacos;
import com.alibaba.nacos.api.config.listener.Listener;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Executor;
/**
* User:Json
* Date: 2024/3/28
**/
@Slf4j
public class YmlCallListener implements Listener {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
//log.info("Yml配置内容发生更改:{}", configInfo);
}
}
最后一步
package com.init.init;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.api.constant.CommonConstant;
import com.api.response.nacos.SystemConfigNacos;
import com.init.config.nacos.DataIdConfig;
import com.init.config.nacos.JsonCallListener;
import com.init.config.nacos.NacosInitConfig;
import com.init.utils.RedisUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Properties;
/**
* User:Json
* Date: 2024/3/22
* Spring Boot应用程序启动后执行某些操作
* 我用的是这个 启动项 因为 我要redis
* 如果你不需要用redis
* 用
* @PostConstruct
private void init()
也行
**/
@Component
@Slf4j
@Data
public class NacosInitializeRunner implements CommandLineRunner {
@Autowired
private NacosInitConfig nacosInitConfig;
@Override
public void run(String... args) {
nacosInitConfig.nacos();
}
}
启动项目测试