软件编程
位置:首页>> 软件编程>> java编程>> springboot整合nacos,如何读取nacos配置文件

springboot整合nacos,如何读取nacos配置文件

作者:L小象  发布时间:2022-12-30 19:55:25 

标签:springboot,nacos,配置文件

springboot整合nacos

1、引入依赖

<dependency>
   <groupId>com.alibaba.boot</groupId>
   <artifactId>nacos-config-spring-boot-starter</artifactId>
   <version>0.2.7</version>
</dependency>

2、启用类上使用配置

@NacosPropertySource(dataId="xxx",groupId="xxx",autoRefreshed=true,type=ConfigType.xxxx)

其中dataId和Group就是配置页的内容。

  • autoRefreshed 是否实时更新,true:是;false:否

  • type:可以指定nacos配置文件的类型,与下保持一致。

springboot整合nacos,如何读取nacos配置文件

3、配置文件中配置nacos信息

创建application.properties,并写入nacos配置信息:

nacos.config.server-addr=127.0.0.1:8848
 nacos.config.namespace=namespace
 nacos.config.username=username
 nacos.config.password=password

启动服务即可。

补充1:nacos其实只提供了json、properties、yaml、xml四种默认配置,如果你用的是其他文件类型就需要自己定义。我这里用的文件类型是media,所以需要自定义一下,如图所示:

报错:

springboot整合nacos,如何读取nacos配置文件

解决办法:

1、在本服务的resource下新建 META-INF/services 文件夹

2、新建文件 com.alibaba.nacos.spring.util.ConfigParse 文件,内容写自定义的配置文件地址,如果所示:

springboot整合nacos,如何读取nacos配置文件

3、自定义返回配置文件类型 

/**
* @Author: liuxiaoxiang
* @Date: 2021/1/26 22:52
*/

import com.alibaba.nacos.spring.util.parse.DefaultPropertiesConfigParse;

/**
* @author :liuxiaoxiang
* @Date: :2021/1/26 22:52
* @description:
*/
public class DefaultMediaConfigParse extends DefaultPropertiesConfigParse {

@Override
   public String processType() {
       return "media";
   }
}

补充2:上述获取nacos的相关信息是通过配置文件配置的,如果想从环境变量获取nacos配置,在可以项目启动时将nacos配置信息放到环境变量中,因为nacos内部代码是先从环境变量中加载nacos配置信息:

@ComponentScan(basePackages = {"com.xiang"})
@SpringBootApplication
@CrossOrigin
@NacosPropertySource(dataId = "xxx", groupId = "xxx", autoRefreshed = true, type = ConfigType.TEXT)
public class NacosApplication {

public static void main(String[] args) {
       SpringApplication.run(NacosApplication.class, args);
       System.out.println("启动成功");
   }

static {
       List<String> list = Arrays.asList(String.valueOf(System.getenv().get("HITENACOS")).split(":"));
       System.setProperty("nacos.config.server-addr", "127.0.0.1:8848");
       System.setProperty("nacos.config.namespace", "namespace");
       System.setProperty("nacos.config.username", "username");
       System.setProperty("nacos.config.password", "password");
   }
}

或者,放到配置信息 Properties中,nacos会在加载了sercer-addr 等配置信息后,跟@NacosPropertySource 中的信息进行合并,也可以在此时读取配置信息,具体写法如下:


   /**
    * 方式二:将nacos信息保存到properties,nacos会将@NacosPropertySource和配置文件中的信息合并生成nacos配置
    */
   @Bean
   static Properties globalNacosProperties() {
       //创建spplication文件并保存信息
       Map<String, String> map = NacosInfo.getNacosConfigBySystem();
       Properties properties = new Properties();
       properties.setProperty(NacosConstants.SERVERADDR_KEY, NacosConstants.SERVERADDR_VALUE);
       properties.setProperty(NacosConstants.NAMESPACE_KAY, map.get(NacosConstants.NAMESPACE_KAY));
       properties.setProperty(NacosConstants.USERNAME_KEY, map.get(NacosConstants.USERNAME_KEY));
       properties.setProperty(NacosConstants.PASSWORD_KEY, map.get(NacosConstants.PASSWORD_KEY));
       log.info("获取到的内存中的信息为:" + map.toString());
       return properties;
   }

从环境变量中获取nacos配置信息:

package com.honghe.common.util.nacos;

import com.honghe.common.util.constants.NacosConstants;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @Description
* @Author liuxiaoxiang
* @Date: 2021-01-28 18:48
* @Mender:
*/
@Slf4j
public class NacosInfo {

/**
    * 从系统中获取nacos配置信息
    *
    * @return
    */
   public static Map<String, String> getNacosConfigBySystem() {
       String nacosInfos = null;
       Map<String, String> map = System.getenv();
       if (map.size() > 0 && map.containsKey(NacosConstants.HITENACOS)) {
           nacosInfos = map.get(NacosConstants.HITENACOS);
           log.info("通过env获取");
       } else {
           nacosInfos = System.getProperties().getProperty(NacosConstants.HITENACOS);
           log.info("通过系统变量获取");
       }
       //解析value
       Map<String, String> nacosInfoMap = new HashMap();
       if (null != nacosInfos && nacosInfos.contains(NacosConstants.split_)) {
           List<String> list = Arrays.asList(nacosInfos.split(NacosConstants.split_));
           if (list.size() >= 3) {
               log.info("从环境变量中获取hitenacos信息成功:" + list);
               nacosInfoMap.put(NacosConstants.NAMESPACE_KAY, list.get(0));
               nacosInfoMap.put(NacosConstants.USERNAME_KEY, list.get(1));
               nacosInfoMap.put(NacosConstants.PASSWORD_KEY, list.get(2));
           } else {
               log.info("从环境变量中获取hitenacos信息,value值小于3个");
           }
       } else {
           log.info("从环境变量中获取hitenacos信息失败");
       }
       return nacosInfoMap;
   }
}

nacos常量类:

/**
* @Description
* @Author liuxiaoxiang
* @Date: 2021-03-16
* @Mender:
*/
public class NacosConstants {

public static final String HITENACOS = "HITENACOS";
   //读取的文件名
   public static final String FILE_NAME = "application";

//nacos配置信息
   public static final String SERVERADDR_KEY = "serverAddr";
   public static final String SERVERADDR_VALUE = "localhost:8848";
   public static final String NAMESPACE_KAY = "namespace";
   public static final String USERNAME_KEY = "username";
   public static final String PASSWORD_KEY = "password";

public static final String NACOS_SERVERADDR_KEY = "nacos.config.server-addr";
   public static final String NACOS_NAMESPACE_KAY = "nacos.config.namespace";
   public static final String NACOS_USERNAME_KEY = "nacos.config.username";
   public static final String NACOS_PASSWORD_KEY = "nacos.config.password";

public static final String split_ = ":";
}

springboot集成nacos,本地运行正常,打包报错

问题

springboot集成nacos后,本地运行没有任何问题,但是打包就报错&mdash;&mdash;读取。

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException:

解决方案

把nacos配置中的中文注释去掉,再打包就没有问题了。

PS:排查过程有些繁琐,能查到的方案都尝试过,但都无效,最终我的解决方案也是很简单的。

来源:https://blog.csdn.net/qq_41312061/article/details/113599301

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com