springboot整合nacos,如何读取nacos配置文件
作者:L小象 发布时间:2022-12-30 19:55:25
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配置文件的类型,与下保持一致。
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,所以需要自定义一下,如图所示:
报错:
解决办法:
1、在本服务的resource下新建 META-INF/services 文件夹
2、新建文件 com.alibaba.nacos.spring.util.ConfigParse 文件,内容写自定义的配置文件地址,如果所示:
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后,本地运行没有任何问题,但是打包就报错——读取。
Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException:
解决方案
把nacos配置中的中文注释去掉,再打包就没有问题了。
PS:排查过程有些繁琐,能查到的方案都尝试过,但都无效,最终我的解决方案也是很简单的。
来源:https://blog.csdn.net/qq_41312061/article/details/113599301
猜你喜欢
- 包的作用,1是为了防止类和方法的重名,2是为了管理众多的java类。步骤 1 工具包里面有很多个工具类之前讲了打印数据的方法:S
- 1. 运算符是什么?1.1 定义:对常量和变量进行运算操作的符号程序对数据进行运算时要用运算符1.2 常见运算符的概述1.3 表达式1.3.
- 功能函数// 图像旋转void Rotate(const cv::Mat &srcImage, cv::Mat &dstIm
- 很不错的蓝牙通信demo实现发送和接受功能,就用了两个类就实现了,具体内容如下说下思路把 主要有两个类 主界面类 和 蓝牙聊天服务类&nbs
- 对 Excel 进行读写操作是生产环境下常见的业务,网上搜索的实现方式都是基于POI和JXL第三方框架,但都不是很全面。小编由于这两天刚好需
- 1.System类System系统类,主要用于获取系统的属性数据和其他操作,因其构造方法是私有的并且类中的成员方法都是静态的,所以在使用的时
- 本文实例讲述了C#判断一天、一年已经过了百分之多少的方法。分享给大家供大家参考。具体如下:这里写了四个函数,分别是1.判断当前时间过了今天的
- createCoroutine 和 startCoroutine协程到底是怎么创建和启动的?本篇文章带你揭晓。在Continuation.k
- package com.cjonline.foundation.evisa;import java.io.BufferedReader;im
- 本文实例为大家分享了unity实现手游虚拟摇杆的具体代码,供大家参考,具体内容如下using System.Collections;usin
- 一、代理的概念 * 技术是整个java技术中最重要的一个技术,它是学习java框架的基础,不会 * 技术,那么在学习Spring这些框架
- JDK1.7以及以前:接口(interface)在JDK7及之前的版本对接口的要求:接口定义:使用 interface 关键字 。接口中的
- 上周工作中遇到一个奇怪的问题,解决之后想想还是写出来和大家分享一下。故障描述:在A程序中使用Process.Start方法调用一个B.exe
- 一、理解 Android 的 WindowWindow 表示一个窗口的概念,是一个抽象的概念,每一个 Window 都对应一个 View 和
- 本文为大家介绍了java图片添加水印实例代码,java实现水印还是非常方便的,水印可以是图片或者文字,具体内容如下package micha
- 本文实例为大家分享了在Android中如何实现下拉导航选择菜单效果的全过程,供大家参考,具体内容如下关于下拉导航选择菜单效果在新闻客户端中用
- 下面代码看下java判断http地址是否连通private boolean isOk(String url) {
- 在游戏开发中,主角需要通过跑地图来通关升级,本章主要介绍主角的移动和摄像跟随的操作。主角移动角色位移通过主角的骨骼动画控制(后续文章会详细介
- 最近做项目,碰到如下的需求:ViewPager分页,如果是6页(包括6页)就用圆点,如果是6页以上就用进度条来切换。前面一种交互方法最常见,
- 最近解决了一个令我头疼好久的问题,就是三星手机拍照图片旋转的问题,项目中有上传图片的功能,那么涉及到拍照,从相册中选择图片,别的手机都ok没