本文用的是 Nacos作为配置中心注册监听器方法 实现热更新 nacos 配置文件
从而不用重启项目

依赖、工具类 这边就不写了

因为项目用的是 Json 类型的配置文件
所以下文 主要是对json文件进行实现
别的文件大同小异
先说扯淡的东西

nacos的各种类型的配置文件 yml 、json、 Properties、 text 等文件类型 发生变化怎么热更新,实现实时监听nacos配置文件变化-LMLPHP
在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();
    }





}

启动项目测试

03-29 08:45