在企业及大型分布式项目开发中,如果这个项目是基于Nacos以及阿里巴巴的一套分布式解决方案去构建的项目,那么在程序部署时加载外部yml文件时,外乎是使用两种方式,一种是通过boot strap . Yaml去在程序运行之前显示的去通过在配置中心中加载外部依赖的方式去实现一些资源的配置另一种方式就是在你的版本体系较新的情况下,通过Nacos config import的方式去加载外部的配置。
首先这两种方式都是基于nacos config去实现的,只是在一些场景和公司技术选型上有所差异。
1. 首先想说bootstrap.yml引入外部yml的方式:
- 需要在 Spring Boot 初始化阶段拉取配置
-
- 如果你的应用需要在服务启动之前就确定 配置中心地址 或 服务发现地址。
- 需要加载敏感信息或加密信息
-
- 使用
bootstrap.yml
拉取敏感信息如数据库密码、加密密钥等。
- 使用
- 多环境切换
-
- 如果你的项目需要频繁切换不同环境,
bootstrap.yml
可以优先加载对应环境的配置。
- 如果你的项目需要频繁切换不同环境,
- 统一配置管理
-
- 在分布式系统中,如果多个微服务共用同一套 Nacos 配置地址和基础配置,通过
bootstrap.yml
统一配置更加方便。
- 在分布式系统中,如果多个微服务共用同一套 Nacos 配置地址和基础配置,通过
这种方式对nacos config版本的要求很低,一般使用0.9.0发行版就可以正常使用
依赖则使用:
这两个依赖必须要引入,并且使用bootstrap的方式挂载外部yml时,程序启动前就会加载配置中心的信息,因此你可以基于 应用名+dev 的方式去自动的配置一个外部yml,说人话就是这个意思:
相当于你可以直接命名一个这个yml并直接让项目自动引入这个外部yml
2. 第二种方式:使用 application.yml
和 spring.config.import
适用场景
- 启动阶段不依赖配置中心
-
- 如果应用的基础配置(如端口、线程数等)不依赖外部配置,直接通过
application.yml
配置即可。
- 如果应用的基础配置(如端口、线程数等)不依赖外部配置,直接通过
- Nacos 仅用于业务配置
-
- 如果 Nacos 主要存储业务相关配置,如接口地址、限流策略等,不影响应用启动。
- 有良好的配置管理策略
-
- 如果你的公司配置管理规范良好,配置变更后无需重启服务,动态刷新即可。
- CI/CD 体系健全
-
- 在拥有完善的 DevOps 体系下,通过环境变量指定 Nacos 地址即可,不需要
bootstrap.yml
。
- 在拥有完善的 DevOps 体系下,通过环境变量指定 Nacos 地址即可,不需要
✅ 示例:application-dev.yml
中的配置
yaml
复制
spring:
application:
name: admin-gateway
cloud:
nacos:
username: ${NACOS_USERNAME:}
password: ${NACOS_PASSWORD:}
server-addr: ${NACOS_CONFIG_PATH:}
discovery:
namespace: ${spring.profiles.active}
group: @nacos.discovery.group@
ip: ${NACOS_IP:}
config:
namespace: ${spring.cloud.nacos.discovery.namespace}
group: @nacos.config.group@
config:
import:
- optional:nacos:application-common.yml
- optional:nacos:datasource.yml
- optional:nacos:application-dubbo.yml
- optional:nacos:${spring.application.name}.yml
解释:
spring.config.import
:动态导入 Nacos 的配置文件。optional:nacos
:即使配置文件不存在也不会报错。${spring.application.name}.yml
:自动加载和服务名对应的配置文件。- 使用环境变量
${NACOS_SERVER_ADDR}
确保环境切换灵活。
优势:
- 简化配置管理,不需要额外的
bootstrap.yml
。 - 动态加载配置,支持热更新。
- 配置变更后无需重启服务。
劣势:
- 如果 Nacos 出现故障,可能导致配置加载失败,影响服务启动。
- 适合启动后加载配置的场景,不适合依赖配置中心的启动场景。
使用这种方式有一个注意点就是必须要引入依赖:
这个依赖才能获取到最新的特性和功能,而刚刚的标准化bootstrap写法实际上使用的:
org.springframework.cloud维护的nacosconfig并不支持这种写法,有很多特有功能没有维护,和精简掉了:
-
org.springframework.cloud
-
这是由 Spring Cloud 官方维护的 Spring Cloud Alibaba 版本。
-
它通常会滞后于 Alibaba 官方版本。
-
部分功能在官方版本中可能会被精简或调整。
-
-
com.alibaba.cloud
-
这是由 阿里巴巴官方维护的 Spring Cloud Alibaba 版本。
-
它通常会包含更多针对阿里云生态的优化和最新特性。
-
例如:Nacos、RocketMQ、Sentinel 等服务的最新支持。
-
如果你使用spring维护的版本始终无法实现nacos config的某些特有功能可能是:
-
版本不兼容
-
org.springframework.cloud
的部分版本中对 Nacos 的支持较弱,某些版本可能存在 Bug,导致配置无法正确加载。
-
-
功能精简
-
Spring Cloud 官方版本有时会移除部分 Alibaba 的特有功能。像
spring.config.import
或optional:nacos
等功能可能没有完全兼容。
-
-
依赖缺失
-
如果使用了官方版本,有可能某些依赖没有正确拉取。例如 Nacos Config 需要额外的 Spring Cloud Context 支持。
-