springcloud nacos配置优先级研究及配置管理最佳实践

背景

公司有很多应用是基于SpringBoot/SpringCloud开发。由于在配置文件中经常会涉及数据库账号密码之类的敏感信息,因此之前项目管理过程中,配置与代码要求分开管理,在打包jar的时候不允许将配置打包到jar中,导致在jar启动时需要外挂一个很大的配置文件。以前配置项较少时还好,但后来配置项越来越多,部署的环境、代码的版本也越来越多之后,运维人员一个头两个大,经常出现配置版本和代码版本不一致的现象。本文先对SpringCloud及nacos的配置优先级进行研究,再提出一种多环境、多版本代码的项目配置管理最佳实践方案。

工具版本

工具名称版本
SpringBoot2.7.17
SpringCloud2021.0.8
Nacos Client Version2021.0.5.0
Nacos Server version2.1.2
JDK1.8.0_391
操作系统win10

SpringCloud配置存放位置及相应优先级

代码中

SpringBoot/SpringCloud应用,代码中有四个地方可以存放配置文件,文件名统一为application[-profile].propertis/yaml。properties比yaml优先级要高,在指定了spring.profiles.active的情况下,带profile(如dev)后缀的,比不带profile的高。按优先级低到高排序依次是

  1. classpath根目录(即resources根目录)
  2. classpath下的config目录(即resources/config目录)
  3. 项目根目录
  4. 项目config目录

在这里插入图片描述
注意上述3、4位置的配置,在mvn package的时候,是不会被打包进jar的。而1和2会被打包到代码根目录(classes目录)
在这里插入图片描述

nacos

在使用nacos的情况下,只需要添加一个bootstrap.propertis/yaml(最新版的nacos已经默认不使用bootstrap了,但为了兼容旧的代码,此处以bootstrap为例来讲),nacos会自动根据prefix(默认为spring.application.name)、spring.profiles.active、spring.profiles.include、file-extension、shared-configs、extension-configs、group等条件来拼接所要的nacos配置文件名,例如下述场景

bootstrap.yaml

spring:
  profiles:
    include:
      - include
    active:
      - dev
      - dev2

bootstrap-dev.yaml

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: test
        file-extension: yaml
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        prefix: springcloud_app_config_learning
        shared-configs:
          - dataId: springcloud_app_config_learning-shared.yaml
            group: group-shared
        extension-configs:
          - dataId: springcloud_app_config_learning-ext.yaml
            group: group-ext

项目启动的时候则会在nacos找如下文件(找不到不会报错)。由于nacos需要指定文件后缀,因此不存在properties与yaml优先级的区别,但在有spring.profile.active的情况下,带profile的文件优先级一样高于不带profile后缀,非共享非扩展配置比共享扩展配置优先级高,扩展配置比共享配置优先级高。总的来讲,优先级从高到低排序为:

优先级文件名group
1springcloud_app_config_learning-dev2.yamlDEFAULT_GROUP
2springcloud_app_config_learning-dev.yamlDEFAULT_GROUP
3springcloud_app_config_learning-include.yamlDEFAULT_GROUP
4springcloud_app_config_learning.yamlDEFAULT_GROUP
5springcloud_app_config_learningDEFAULT_GROUP
6springcloud_app_config_learning-ext.yamlgroup-ext
7springcloud_app_config_learning-shared.yamlgroup-shared

jar包外挂

主要是指启动jar时,使用spring.profiles.active、spring.config.location 以及 spring.config.additional-location 三个命令指定配置。这三命令的功能分别是:

命令作用
spring.profiles.active指定active的profile,如果有此命令,则其它区域指定的spring.profiles.active将被覆盖
spring.config.location指定jar将从指定的区域找配置,并忽略其它区域的配置
spring.config.additional-location指定jar从指定的区域寻找配置,并同classpath、nacos等区域的配置进行merge

如果使用了spring.config.location,例如java -jar application.jar spring.config.location=/1.yaml,classpath:/config/2.yaml,程序启动时将只会从虚拟机/1.yaml和resources目录下的2.yaml中寻找配置,并且不会与其它配置做merge操作。2.yaml优先级高于1.yaml。

在使用 spring.config.additional-location 时,会与classpath和nacos中的配置进行merge,additional-location的优先级高于classpath及nacos。

spring.config.additional-location与spring.profiles.active一起使用时,spring.profiles.active的优先级高于spring.config.additional-location中指定的spring.profiles.active。例如java -jar application.jar --spring.config.additional-location=/app.yaml --spring.profiles.active=test

# app.yaml:
spring:
  profiles:
    active:
      - dev

多种配置共同存在时的优先级

当同时存在代码、nacos和jar包外挂配置时,优先级从高到底是

jar包外挂配置 > nacos > 代码

归纳一下,按优先级从高到低排序:

  1. jar运行命令中的spring.config.location
  2. jar运行命令中的spring.profiles.active
  3. jar运行命令中的spring.config.additional-location
  4. nacos中带profile的配置(当有spring.profiles.active时)
  5. nacos中spring.profiles.include的配置(当有spring.profiles.include时)
  6. nacos中不带profile的配置
  7. nacos中的ext配置
  8. nacos中shared配置
  9. 代码根目录/config/(此配置不会打包打jar)
  10. 代码根目录(此配置不会打包打jar)
  11. 代码classpath/config(即resouces/config)
  12. 代码classpath根目录

使用spring.config.location时,其它位置的配置全部不生效。
不使用spring.config.location时,配置优先级从高到低进行merge。

项目配置管理最佳实践

配置文件中的内容,可以大体分成两类,一类是随着环境需要调整的配置,例如mysql、redis、nacos的地址、账号、密码;另一类是跟业务相关的配置,一般不会随着环境变动。

结合上述配置优先级,结合有无nacos两种情况,适合多环境开发、部署的配置管理方案为

无nacos的情况

  • 将业务配置放到resources/config/application.yaml中,如果有多个profile,将最常用的环境的配置置于application.yaml,不要加profile,其它不常用的环境加上profile后缀。
    在这里插入图片描述

  • 将环境相关配置,以及spring.profiles.include、spring.profiles.active放到根目录/config/application.yaml中。
    在这里插入图片描述

  • 部署时,外挂环境相关配置,格式与环境相关配置一致,命令为java -jar xxx.jar --spring.config.additional-location=/app.yaml

有nacos的情况

  • 将业务配置放到resources/config/application.yaml中,如果有多个profile,将最常用的环境的配置置于application.yaml,不要加profile,其它不常用的环境加上profile后缀。
    在这里插入图片描述
  • 将nacos的配置,spring.profiles.include、spring.profiles.active放到根目录/config/bootstrap.yaml中。如果有多个profile,将最常用的环境的配置置于bootstrap.yaml,不要加profile,其它不常用的环境加上profile后缀。不同的profile对应不同的nacos的namespace
    在这里插入图片描述
  • 将环境相关配置放到nacos中,如果有多个profile,设置多个namespace
    在这里插入图片描述
    在这里插入图片描述
  • 通过java -jar启动时,外挂nacos相关配置,格式与/config/bootstrap.yaml一致。命令为java -jar xxx.jar --spring.config.additional-location=/bootstrap.yaml

打包时,与业务相关的配置会随着jar一起发布,而与环境有关的配置,又跟jar进行了隔离,如此,运维人员在部署新环境或升级新版本时,只需要专注修改与环境相关的少量配置即可,既不会造成敏感信息泄露,又降低了运维人员变更配置的难度。

参考文献

SpringBoot 配置加载优先级详解
SpringBoot配置及Nacos配置中心加载顺序及覆盖生效优先关系
SpringBoot加载外部/内部配置文件的顺序和覆盖优先级总结
Spring Boot的配置文件加载优先级
SpringBoot配置加载,各配置文件优先级对比

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Cloud NacosSpring Cloud生态体系中的一个组件,它提供了一种动态服务发现、配置管理和服务管理的解决方案。下面是如何在Spring Cloud应用程序中使用Nacos作为配置中心的步骤: 1. 添加依赖 在pom.xml中添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> ``` 2. 配置bootstrap.properties 在Spring Cloud应用程序的classpath下创建bootstrap.properties文件,并添加以下配置: ``` spring.cloud.nacos.config.server-addr = localhost:8848 spring.cloud.nacos.config.namespace = your-namespace spring.cloud.nacos.config.group = your-group spring.cloud.nacos.config.prefix = your-prefix spring.cloud.nacos.config.file-extension = properties ``` 其中,`server-addr`指定了Nacos服务端的地址和端口,`namespace`指定了命名空间,`group`指定了配置所属的分组,`prefix`指定了配置的前缀,`file-extension`指定了配置文件的后缀名。 3. 配置中心添加配置Nacos配置中心添加配置,例如,在命名空间为`your-namespace`,分组为`your-group`,前缀为`your-prefix`的配置中心中添加一个名为`config.properties`的配置文件,内容如下: ``` key=value ``` 4. 读取配置 在需要使用配置的地方,可以通过`@Value`注解或`Environment`对象来读取配置,例如: ``` @Value("${key}") private String value; @Autowired private Environment env; ... String value = env.getProperty("key"); ``` 这样就可以在Spring Cloud应用程序中使用Nacos作为配置中心了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值