通过代码获取nacos中配置的yml或properties(静态项目导个nacos的包也可使用父级的配置)

  1. 新建个工具类 YamlUtils
package com.baasia.common.utils.utils;

import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;

import java.io.FileWriter;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author Yuan
 */
@Slf4j
@Component
public class YamlUtils {

    private final static DumperOptions OPTIONS = new DumperOptions();

    static {
        //设置yaml读取方式为块读取
        OPTIONS.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
        OPTIONS.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
        OPTIONS.setPrettyFlow(false);
    }

    /**
     * 将yaml配置文件转化成map
     * fileName 默认是resources目录下的yaml文件, 如果yaml文件在resources子目录下,需要加上子目录 比如:conf/config.yaml
     *
     * @param fileName
     * @return
     */
    public Map<String, Object> getYamlToMap(String fileName) {
        LinkedHashMap<String, Object> yamls = new LinkedHashMap<String, Object>();
        Yaml yaml = new Yaml();
        try {
            @Cleanup InputStream in = YamlUtils.class.getClassLoader().getResourceAsStream(fileName);
            yamls = yaml.loadAs(in, LinkedHashMap.class);
        } catch (Exception e) {
            log.error("{} load failed !!!", fileName);
        }
        return yamls;
    }

    /**
     * key格式:aaa.bbb.ccc
     * 通过properties的方式获取yaml中的属性值
     *
     * @param key
     * @param yamlMap
     * @return
     */
    public Object getValue(String key, Map<String, Object> yamlMap) {
        String[] keys = key.split("[.]");
        Object o = yamlMap.get(keys[0]);
        if (key.contains(".")) {
            if (o instanceof Map) {
                return getValue(key.substring(key.indexOf(".") + 1), (Map<String, Object>) o);
            } else {
                return null;
            }
        } else {
            return o;
        }
    }

    /**
     * 使用递归的方式设置map中的值,仅适合单一属性
     * key的格式: "server.port"
     * server.port=111
     **/
    public Map<String, Object> setValue(String key, Object value) {
        Map<String, Object> result = new LinkedHashMap<String, Object>();
        String[] keys = key.split("[.]");
        int i = keys.length - 1;
        result.put(keys[i], value);
        if (i > 0) {
            return setValue(key.substring(0, key.lastIndexOf(".")), result);
        }
        return result;
    }

    public Map<String, Object> setValue(Map<String, Object> map, String key, Object value) {

        String[] keys = key.split("\\.");

        int len = keys.length;
        Map temp = map;
        for (int i = 0; i < len - 1; i++) {
            if (temp.containsKey(keys[i])) {
                temp = (Map) temp.get(keys[i]);
            } else {
                return null;
            }
            if (i == len - 2) {
                temp.put(keys[i + 1], value);
            }
        }
        for (int j = 0; j < len - 1; j++) {
            if (j == len - 1) {
                map.put(keys[j], temp);
            }
        }
        return map;
    }


    /**
     * 修改yaml中属性的值
     *
     * @param key      key是properties的方式: aaa.bbb.ccc (key不存在不修改)
     * @param value    新的属性值 (新属性值和旧属性值一样,不修改)
     * @param yamlName
     * @return true 修改成功,false 修改失败。
     */
    public boolean updateYaml(String key, Object value, String yamlName) {

        Map<String, Object> yamlToMap = this.getYamlToMap(yamlName);
        if (null == yamlToMap) {
            return false;
        }
        Object oldVal = this.getValue(key, yamlToMap);

        //未找到key 不修改
        if (null == oldVal) {
            log.error("{} key is not found", key);
            return false;
        }
        //不是最小节点值,不修改
        if (oldVal instanceof Map) {
            log.error("input key is not last node {}", key);
            return false;
        }

        //新旧值一样 不修改
        if (value.equals(oldVal)) {
            log.info("newVal equals oldVal, newVal: {} , oldVal: {}", value, oldVal);
            return false;
        }

        Yaml yaml = new Yaml(OPTIONS);
        String path = this.getClass().getClassLoader().getResource(yamlName).getPath();
        try {
            Map<String, Object> resultMap = this.setValue(yamlToMap, key, value);
            if (resultMap != null) {
                yaml.dump(this.setValue(yamlToMap, key, value), new FileWriter(path));
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            log.error("yaml file update failed !");
            log.error("msg : {} ", e.getMessage());
            log.error("cause : {} ", e.getCause());
        }
        return false;
    }



    /**
     * 修改yaml中属性的值(就算key为 null也肯定会修改)
     *
     * @param key      key是properties的方式: aaa.bbb.ccc (key不存在不修改)
     * @param value    新的属性值 (新属性值和旧属性值一样,不修改)
     * @param yamlName
     * @return true 修改成功,false 修改失败。
     */
    public boolean updateYamlToNULL(String key, Object value, String yamlName) {

        Map<String, Object> yamlToMap = this.getYamlToMap(yamlName);
        if (null == yamlToMap) {
            return false;
        }
        Object oldVal = this.getValue(key, yamlToMap);
        //不是最小节点值,不修改
        if (oldVal instanceof Map) {
            log.error("input key is not last node {}", key);
            return false;
        }
        Yaml yaml = new Yaml(OPTIONS);
        String path = this.getClass().getClassLoader().getResource(yamlName).getPath();
        try {
            Map<String, Object> resultMap = this.setValue(yamlToMap, key, value);
            if (resultMap != null) {
                yaml.dump(this.setValue(yamlToMap, key, value), new FileWriter(path));
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            log.error("yaml file update failed !");
            log.error("msg : {} ", e.getMessage());
            log.error("cause : {} ", e.getCause());
        }
        return false;
    }

    public static void main(String[] args) {

        YamlUtils configs = new YamlUtils();

        Map<String, Object> yamlToMap = configs.getYamlToMap("conf/config.yaml");

        System.out.println(yamlToMap);

        boolean b = configs.updateYaml("sys.cpu.name", "Intel Core i7", "conf/config.yaml");
        System.out.println(b);

        System.out.println(configs.getYamlToMap("conf/config.yaml"));
    }

}


package com.baasia.common.utils.config.nacos;

import com.baasia.common.utils.constant.AuthConstant;
import com.baasia.common.utils.utils.ContextUtil;
import com.baasia.common.utils.utils.YamlUtils;
import lombok.extern.log4j.Log4j2;

import java.io.IOException;
import java.util.Map;

@Log4j2
public class NacosConfig {

    //读取的文件
    public static final String BOOTSTRAP_YML_URL = "bootstrap.yml";
    /**
     * nacos 地址
     */
    public static final String NACOS_SERVER_ADDR = "spring.cloud.nacos.config.server-addr";
    /**
     * nacos discovery 地址
     */
    public static final String NACOS_SERVER_DISCOVERY_ADDR = "spring.cloud.nacos.discovery.server-addr";
    /**
     * 项目启动的环境
     */
    public static final String ACTIVE_CONFIG = "spring.profiles.active";

    /**
     * 修改nacos 默认
     * 项目初始化前先执行当前参数用于初始化class 文件中的配置
     */
    public void upNacosData(){
        YamlUtils configs = new YamlUtils();
        Map<String, Object> yamlToMap = configs.getYamlToMap(BOOTSTRAP_YML_URL);
        //项目启动环境参数
        Object env = configs.getValue(ACTIVE_CONFIG, yamlToMap);
        //nacos 地址参数
        Object nacos = configs.getValue(NACOS_SERVER_ADDR, yamlToMap);
        /**
         * 判断nacos 是否有值,没有则使用
         */
        Object bootstrapNacos = configs.getValue(NACOS_SERVER_ADDR, yamlToMap);
        if (null == bootstrapNacos || "".equals(bootstrapNacos)){
            //参数默认读取dev
            nacos = AuthConstant.NACOS_DEV;
            env = AuthConstant.DEV;
        }
        //调用私有方法设置yaml 文件参数
        setNacosUrl(configs, NACOS_SERVER_ADDR, nacos !=null?nacos.toString():null, BOOTSTRAP_YML_URL, ACTIVE_CONFIG, env != null ? 		  env.toString() : null);
    }

    /**
     * 设置nacos 地址
     * @param configs
     * @param nacos           nacos项配置位置
     * @param nacosUrl        nacosUrl nacos路径
     * @param bootstrapYml    bootstrap 文件名称
     * @param activeConfig    项目启动的环境配置位置
     * @param env             环境变量
     */
    private void setNacosUrl(YamlUtils configs, String nacos, String nacosUrl, String bootstrapYml, String activeConfig, String env) {
        //修改nacos
        boolean flag = configs.updateYamlToNULL(nacos, nacosUrl, bootstrapYml);
        //修改启动配置
        configs.updateYamlToNULL(activeConfig, env, bootstrapYml);
        log.info("环境变量:" + env + "--------------->nacos地址:" + nacosUrl);
    }


    public void nacosDate() throws IOException {
        //springBoot 启动时将环境参数放入了ApplicationContext 中,这个工具类就是获取ApplicationContext的环境参数
        String activeProfile = new ContextUtil().getActiveProfile();
        YamlUtils configs = new YamlUtils();
        Map<String, Object> yamlToMap = configs.getYamlToMap(BOOTSTRAP_YML_URL);
        System.out.println(yamlToMap);
        /**
         * 设置nacos 地址
         */
        if (AuthConstant.TEST.equals(activeProfile)) {
            setNacosUrl(configs, NACOS_SERVER_ADDR, AuthConstant.NACOS_TEST, BOOTSTRAP_YML_URL, ACTIVE_CONFIG, AuthConstant.TEST);
            setNacosUrl(configs, NACOS_SERVER_DISCOVERY_ADDR, AuthConstant.NACOS_TEST, BOOTSTRAP_YML_URL, ACTIVE_CONFIG, AuthConstant.TEST);
        } else if (AuthConstant.PROD.equals(activeProfile)) {
            setNacosUrl(configs, NACOS_SERVER_ADDR, AuthConstant.NACOS_PROD, BOOTSTRAP_YML_URL, ACTIVE_CONFIG, AuthConstant.PROD);
            setNacosUrl(configs, NACOS_SERVER_DISCOVERY_ADDR, AuthConstant.NACOS_PROD, BOOTSTRAP_YML_URL, ACTIVE_CONFIG, AuthConstant.PROD);
        } else {
            setNacosUrl(configs, NACOS_SERVER_ADDR, AuthConstant.NACOS_DEV, BOOTSTRAP_YML_URL, ACTIVE_CONFIG, AuthConstant.DEV);
            setNacosUrl(configs, NACOS_SERVER_DISCOVERY_ADDR, AuthConstant.NACOS_DEV, BOOTSTRAP_YML_URL, ACTIVE_CONFIG, AuthConstant.DEV);
        }
        Map<String, Object> yamlToMaprrrr = configs.getYamlToMap(BOOTSTRAP_YML_URL);
        System.out.println("更改后的nacos: " + yamlToMaprrrr.toString());
    }



}

2.读取nacos配置(Properties 文件)

YamlUtils configs = new YamlUtils();
        Map<String, Object> yamlToMap = configs.getYamlToMap(NacosConfig.BOOTSTRAP_YML_URL);
        //获取nacos地址
        Object nacos = configs.getValue(NacosConfig.NACOS_SERVER_ADDR, yamlToMap);
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, nacos);
        ConfigService configService = NacosFactory.createConfigService(properties);
        String content = configService.getConfig("quartz.properties", "DEFAULT_GROUP", 5000);
        properties.load(new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)));
        //根据key获取
		properties.getProperty("xxxx")

(yml)

YamlUtils configs = new YamlUtils();
            Map<String, Object> yamlToMap = configs.getYamlToMap(NacosConfig.BOOTSTRAP_YML_URL);
            //获取nacos地址
            Object nacos = configs.getValue(NacosConfig.NACOS_SERVER_ADDR, yamlToMap);
            Properties properties = new Properties();
            YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
            //设置获取地址
            properties.put(PropertyKeyConst.SERVER_ADDR, nacos);
            //获取全部nacos配置文件
            ConfigService configService = NacosFactory.createConfigService(properties);
            //根据dataId 与 group 拿去对应的配置文件
            String content = configService.getConfig("commonUrl.yml", "DEFAULT_GROUP", 5000);
            //将内容转为Resource
            yamlFactory.setResources(new ByteArrayResource(content.getBytes()));
            properties = yamlFactory.getObject();
            properties.getProperty("xxxx");

有问题可留言或私信,看到即回

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,你可以使用 Nacos 作为配置心,代替 Spring Boot 的默认配置文件(application.yml 或 application.properties)来管理应用程序的配置。这种方式可以提高配置的灵活性和可管理性,特别是在微服务架构使用。 具体的步骤如下: 1. 在 Spring Boot 项目引入 Nacos 的依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.5.RELEASE</version> </dependency> ``` 2. 在 application.yml 添加 Nacos配置信息: ```yaml spring: cloud: nacos: config: server-addr: ${NACOS_SERVER_ADDR:localhost:8848} namespace: ${NACOS_NAMESPACE:} group: ${NACOS_GROUP:DEFAULT_GROUP} ``` 其,`server-addr` 是 Nacos 服务端的地址,`namespace` 是命名空间,`group` 是配置组名,默认为 `DEFAULT_GROUP`。 3. 在 Nacos 创建配置信息: 在 Nacos 管理界面创建一个配置信息,如下所示: ![nacos-config.png](https://cdn.jsdelivr.net/gh/smileArchitect/img-bed/blog/20210616172451.png) 其,`data-id` 对应的是配置文件的名称,`group` 对应的是配置组名,`content` 对应的是配置文件的内容。 4. 在 Spring Boot 项目使用 Nacos配置信息: 在代码使用 `@Value` 注解来注入 Nacos配置信息,如下所示: ```java @RestController public class HelloController { @Value("${config.name}") private String name; @GetMapping("/hello") public String hello() { return "Hello " + name; } } ``` 其,`${config.name}` 对应的是 Nacos 配置的 `data-id`。 这样就可以使用 Nacos 作为配置心来管理应用程序的配置了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值