2021-11-22 spring-cloud-nacos配置优先级

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-11-22 spring-cloud-nacos配置优先级相关的知识,希望对你有一定的参考价值。

参考技术A 最近有项目组同学问到为什么自己配置了nacos,但配置不生效?我简单看了下,发现问题出在相关配置的优先级模式不同。
spring-boot项目,有bootstrap、application两个配置文件,结合profile,和支持的文件格式properties、yaml,已经有6个配置文件了。然后使用了spring-cloud-starter-alibaba-nacos-config 后,又提供了三级配置。这些配置之间的组合关系,将在无形中影响配置的效果。很多同学只知道其中的一种,因此在无意识引入两种或以上的配置后,就会发现有奇怪的配置不生效问题发生。

spring-boot项目依赖bootstrap.yml 用于应用程序上下文的引导阶段,由父Spring ApplicationContext加载,其工作的阶段为父ApplicationContext 被加载到使用application.yml的之前。也就是说 bootstrap 加载优先于 applicaton。

bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

bootstrap 配置文件有以下几个应用场景:

由于spring-boot支持多种文件格式,所以多种格式之间,其优先级是平等的,只要找到了一个,就会被使用。一般有:.properties、.yaml、.xml等格式。

应用级别的spring-boot配置文件,主要用于 Spring Boot 项目的自动化配置,其加载优先级低于bootstrap.yaml。

nacos作为外部配置服务器,通过spring-boot的bootstrap.yaml引入。但nacos本身,也提供了三级配置体系:主配置(只有一个,但会按照不同后缀名,去找到相关配置)、扩展配置、共享配置。

三级配置的优先级如下:主配置 > 扩展配置 > 共享配置

nacos提供的配置路径 spring.cloud.nacos.config 下,有一系列的属性用于定位主配置。基于 prefix(默认为 $spring.application.name 的值)、namespace、group(默认为字符串 DEFAULT_GROUP )、file-extension(默认为字符串 .properties ),按组装规则 $prefix-$spring.profiles.active.$file-extension 去找到一个配置。

在nacos的所有配置中,主配置(存在的情况下)具有最高的优先级,其同名配置值不能被扩展配置或共享配置中定义的同名属性所覆盖。

上述两类配置都支持三个属性: data-id 、 group (默认为字符串 DEFAULT_GROUP )、 refresh (默认为 true )。

实际上,nacos中并未对 extension-configs 和 shared-configs 的差别进行详细阐述。我们从他们的结构,看不出本质差别;除了优先级不同以外,也没有其他差别。那么,nacos项目组为什么要引入两个类似的配置呢?我们可以从当初 该功能的需求(issue) 上找到其原始目的。
摘要其核心内容如下:

zbb20180716 SpringBoot 使用feign时报错Service id not legal hostname

SpringBoot 使用feign时报错Service id not legal hostname

SpringBoot 使用feign时报错Service id not legal hostname(xx_sss)

 

原因是feign不支持下划线"_",支持"-",改成xx-sss即可

 

参考:https://github.com/spring-cloud/spring-cloud-netflix/issues/1582

以上是关于2021-11-22 spring-cloud-nacos配置优先级的主要内容,如果未能解决你的问题,请参考以下文章

2021-11-22 WPF上位机 92-ModbusASCII消息帧

2021-11-22 WPF上位机 96-Modbus通信代码的封装

2021-11-22 WPF上位机 93-ModbusTCP/IP消息帧

2021-11-22 WPF上位机 89-Modbus协议

2021-11-22 WinFrom面试题 ComboBox控件绑定枚举类型如何实现?

2021-11-22 WPF上位机 90-Modbus协议的分类