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

目录
  • springboot整合nacos
  • 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配置文件的类型,与下保持一致。

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:排查过程有些繁琐,能查到的方案都尝试过,但都无效,最终我的解决方案也是很简单的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • springboot使用nacos的示例详解

    1.pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/PO

  • springboot读取nacos配置文件的实现

    目录 首先,Nacos 的配置文件如下 第一种方式来解析 第二种方式来解析 SpringBoot 注册服务到 Nacos 上,由 Nacos 来做服务的管理.在 Nacos的配置列表中,管理着服务的配置文件.SpringBoot 有两种方式来读取配置文件的内容,一种是写配置文件类 @ConfigurationProperties ,一种是使用 @Value 注解. 首先,Nacos 的配置文件如下 ### 配置文件使用 yml 格式, 也可以使用 properties 格式,最终 yml 格式会

  • SpringBoot实现服务接入nacos注册中心流程详解

    目录 概述 接入nacos注册中心 springboot服务pom文件 application.properties配置 源码分析 小结 源码流程图 概述 某些场景下只需要把springboot微服务化而不想引入springcloud如何实现的呢? 下面我们介绍nacos注册中心方案. 接入nacos注册中心 springboot服务pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="h

  • SpringBoot如何整合nacos详解

    一.什么是nacos nacos支持基于dns和基于rpc的服务发现,可以作为springCloud的注册中心.动态配置服务.动态dns服务. nacos注册中心分为server和client,server采用java编写,为client提供注册发现与配置服务. 二.快速使用 下载中间件:https://nacos.io/zh-cn/docs/quick-start.html 因为推荐使用的是2.0.1版本,我这里下载2.0.1版本. 注意:下载文件放在英文目录下 三.启动nacos 解压nac

  • SpringBoot项目接入Nacos的实现步骤

    前言 项目中没有使用nacos官方提供的方式使用SpringBoot的集成方式来进行集成,而是使用了Alibaba Spring Cloud的依赖包进行集成. 原因是因为官网提供的SpringBoot集成方式中,同时使用配置中心和服务发现功能,会使得服务发现功能配置的部分属性冲突不生效.最直接的就是配置中心和服务发现功能不可以配置2个不同的namespace,会默认选择使用配置中心中配置的namespace作为服务发现的namespace. 另外一点就是可以很好的和Spring的注解兼容,无需额

  • springboot 运行 jar 包读取外部配置文件的问题

    案例:本文主要描述linux系统执行jar包读取jar包同级目录的外部配置文件 方法一:相对路径设置配置文件 (1)在jar包同级目录创建配置文件conf.properties并写入配置数据: confData=data (2)开始写入自动化测试代码 //from www.fhadmin.cn public class Test{ public String getData() throws IOException { //读取配置文件 Properties properties = new P

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

    目录 springboot整合nacos springboot集成nacos,本地运行正常,打包报错 问题 解决方案 springboot整合nacos 1.引入依赖 <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.7</version&g

  • springboot 整合canal实现示例解析

    目录 前言 环境准备 一.快速搭建canal服务 搭建步骤 1.服务器使用docker快速安装一个mysql并开启binlog日志 2.上传canal安装包并解压 3.进入到第二步解压后的文件目录,并修改配置文件 4.启动canal服务 二.与springboot整合 1.Java中使用canal 2.编写一个demo 3.与springboot整合 4.application.yml 配置文件 5.核心工具类 6.提供一个配置类,在程序启动后监听数据变化 7.启动类 前言 在Mysql到Ela

  • 聊聊SpringBoot整合Nacos自动刷新配置的问题

    目录 目的 环境 pom 配置文件 代码 日志 测试 目的 Nacos作为SpringBoot服务的注册中心和配置中心. 在NacosServer中修改配置文件,在SpringBoot不重启的情况下,获取到修改的内容. 本例将在配置文件中配置一个 cml.age=100 的配置项,程序中编写一个方法读取配置文件,并通过 Get--->/test/age 接口提供给浏览器访问. 若配置文件中的 age 修改为 200 ,不用重新启动程序,直接访问 /test/age 接口,将获取到最新的值 200

  • Java springboot 整合 Nacos的实例代码

    Nacos注册中心使用 1)工程添加依赖包 <!-- nacos注册中心依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 监控检查--> <dependency&g

  • Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置的教程

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Docker & Kubernetes相关文章:容器技术 之前介绍了Spring Cloud Config的用法,但对于Kubernetes应用,可能会需要读取ConfigMap的配置,我们看看Springboot是如何方便地读取ConfigMap和Secret. 2 整合Spring Cloud Kubenetes Spring Cloud Kubernetes提供了Spring Cloud应用与Kubernetes服

  • 在.NET Core中用最原生的方式读取Nacos的配置方法(推荐)

    背景 之前老黄写过一篇<ASP.NET Core结合Nacos来完成配置管理和服务发现>简单介绍了如何让.NET Core程序接入Nacos,之前的SDK里面更多的是对Nacos的Open API进行了封装以及对服务注册和发现的封装. 配置这一块当时并没有过多的处理,用起来有时感觉不会特别顺手,所以将它和.NET Core的配置结合起来了,让它用起来更简便. 怎么个简便法呢? 可以说,除了多添加一下provider,其他的操作都是和最原始的一模一样,你想用IConfiguration就用ICo

  • 详解Spring-boot中读取config配置文件的两种方式

    了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件的信息. Spring-Boot读取配置文件的方式: 一.读取核心配置文件信息application.properties的内容 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种,都比较简单. 核心配置文件applicati

  • springboot读取自定义配置文件节点的方法

    今天和大家分享的是自定义配置信息的读取:近期有写博客这样的计划,分别交叉来写springboot方面和springcloud方面的文章,因为springboot预计的篇章很多,这样cloud的文章就需要等到很后面才能写了:分享这两种文章的原因主要是为了方便自己查找资料使用和对将要使用的朋友起到便捷作用: •@Value标记读取(默认可直接读取application.yml的节点) •实体映射application.yml的节点 •实体映射自定义配置文件的节点 •实体映射多层级节点的值 @Valu

随机推荐