本文用的是 Nacos作为配置中心注册监听器方法 实现热更新 nacos 配置文件
从而不用重启项目
依赖、工具类 这边就不写了
因为项目用的是 Json 类型的配置文件
所以下文 主要是对json文件进行实现
别的文件大同小异
先说扯淡的东西
在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;
}
}
}
第四步:
1.
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();
}
}
启动项目测试