springboot整合nacos,如何讀取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就是配置頁的內(nèi)容。
- autoRefreshed 是否實時更新,true:是;false:否
- type:可以指定nacos配置文件的類型,與下保持一致。
3、配置文件中配置nacos信息
創(chuàng)建application.properties,并寫入nacos配置信息:
nacos.config.server-addr=127.0.0.1:8848 nacos.config.namespace=namespace nacos.config.username=username nacos.config.password=password
啟動服務(wù)即可。
補充1:nacos其實只提供了json、properties、yaml、xml四種默認配置,如果你用的是其他文件類型就需要自己定義。我這里用的文件類型是media,所以需要自定義一下,如圖所示:
報錯:
解決辦法:
1、在本服務(wù)的resource下新建 META-INF/services 文件夾
2、新建文件 com.alibaba.nacos.spring.util.ConfigParse 文件,內(nèi)容寫自定義的配置文件地址,如果所示:
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的相關(guān)信息是通過配置文件配置的,如果想從環(huán)境變量獲取nacos配置,在可以項目啟動時將nacos配置信息放到環(huán)境變量中,因為nacos內(nèi)部代碼是先從環(huán)境變量中加載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() { //創(chuàng)建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("獲取到的內(nèi)存中的信息為:" + map.toString()); return properties; }
從環(huán)境變量中獲取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 { /** * 從系統(tǒng)中獲取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("通過系統(tǒng)變量獲取"); } //解析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("從環(huán)境變量中獲取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("從環(huán)境變量中獲取hitenacos信息,value值小于3個"); } } else { log.info("從環(huán)境變量中獲取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:排查過程有些繁瑣,能查到的方案都嘗試過,但都無效,最終我的解決方案也是很簡單的。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot的@Value注解如何設(shè)置默認值
這篇文章主要介紹了SpringBoot的@Value注解如何設(shè)置默認值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02使用Spring源碼報錯java:找不到類 InstrumentationSavingAgent的問題
這篇文章主要介紹了使用Spring源碼報錯java:找不到類 InstrumentationSavingAgent的問題,本文給大家分享解決方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Java使用阻塞隊列BlockingQueue實現(xiàn)生產(chǎn)者消費者的方法
BlockingQueue是一個支持阻塞插入和移除操作的隊列,常用于多線程環(huán)境下的生產(chǎn)者和消費者場景,文章介紹了阻塞隊列BlockingQueue的概念和其在生產(chǎn)者消費者模式中的應(yīng)用,提供了一個簡單的示例,展示了如何使用ArrayBlockingQueue來實現(xiàn)生產(chǎn)者消費者模式2024-11-11