摘要:
SpringBoot启动时,配置读取发生在Bean创建之前,确保依赖配置的Bean能正确初始化。加入Nacos/SpringCloudConfig后,流程变为:先通过bootstrap.yml获取配置中心地址(避免循环依赖),再拉取远程配置合并到环境变量(Environment),最后创建Bean。Nacos简化了架构(内置配置管理),而SpringCloudConfig需独立Git+ConfigServer。两者均通过bootstrap阶段(类似BIOS)引导配置加载,核心思想是先定位配置源,再构建应用上下文。这一机制是Sentinel、Seata等框架动态配置的基础,后续可结合@RefreshScope理解动态刷新原理。
目录
一、普通 Spring Boot 启动流程
整体流程
配置读取发生在哪里?
二、现在加入 Nacos Config
连接Nacos需要地址。
本地启动配置
三、Spring Cloud Config流程
四、为什么叫 bootstrap?
五、Spring Boot启动层级
六、Nacos Config和Spring Cloud Config插入位置
Spring Cloud Config
Nacos Config
七、为什么你感觉Nacos简单?
八、这个知识为什么重要?
Sentinel
Seata
SkyWalking
九、你现在应该记住一个简化版
好的,我们这一节专门解决你刚才卡住的核心:
Spring Boot到底什么时候读取配置?Nacos Config、Spring Cloud Config到底插入在哪一步?
你现在不用管 Config 的代码,先把启动流程建立起来。
一、普通 Spring Boot 启动流程
先看你最熟悉的情况。
一个普通项目:
product-service src/main/resources application.yml启动:
@SpringBootApplication public class ProductApplication { public static void main(String[] args){ SpringApplication.run( ProductApplication.class, args ); } }整体流程
画成:
JVM启动 | ↓ main方法执行 | ↓ SpringApplication.run() | ↓ 读取 application.yml | ↓ 创建 Spring 容器 | ↓ 扫描 Bean | ↓ 创建 Controller/Service/Mapper | ↓ 启动 Tomcat | ↓ 服务运行重点:
配置读取发生在哪里?
非常早。
在:
创建Bean之前为什么?
因为创建Bean可能需要配置。
例如:
你的代码:
@Service public class UserService { @Value("${jwt.secret}") private String secret; }Spring创建UserService的时候:
必须知道:
jwt: secret: abc123在哪里。
所以:
先读配置。
再创建对象。
二、现在加入 Nacos Config
你之前 AIWear其实已经接触类似思想。
以前:
服务 | | application.yml现在:
服务 | | Nacos | | 配置启动流程变:
JVM启动 | ↓ main方法 | ↓ 读取基础配置 | ↓ 连接Nacos | ↓ 拉取远程配置 | ↓ 合并配置 | ↓ 创建Spring Bean | ↓ 启动服务注意:
这里有一个关键:
连接Nacos需要地址。
例如:
spring: cloud: nacos: config: server-addr: localhost:8848这个配置必须提前知道。
所以:
它不能来自Nacos。
否则:
我要去Nacos拿配置 ↓ 但是不知道Nacos在哪里 ↓ 死循环所以:
一定存在:
本地启动配置
比如:
bootstrap.yml里面:
Nacos地址三、Spring Cloud Config流程
现在换成:
Git + Config Server。
架构:
Git | | ↓ Config Server | | ↓ product-service启动:
product-service启动 | ↓ 读取 bootstrap.yml | ↓ 知道 Config Server地址 | ↓ 访问 Config Server | ↓ Config Server访问Git | ↓ 返回配置 | ↓ 创建Spring Bean | ↓ 启动服务所以:
bootstrap.yml的角色:
不是存业务配置。
而是:
告诉Spring:配置在哪里。
四、为什么叫 bootstrap?
bootstrap:
英文:
启动、引导。
它的意思:
在Spring正式启动之前,引导Spring完成准备工作。
类似电脑:
开机:
第一阶段:
BIOS启动。
第二阶段:
Windows启动。
BIOS不是你的日常系统。
但是没有BIOS:
Windows启动不了。
bootstrap类似:
BIOS。
五、Spring Boot启动层级
我们画一个更细的。
JVM | ↓ SpringApplication | ↓ Environment准备阶段 | ↓ 读取配置文件 | ----------------- | | bootstrap.yml application.yml | ↓ Config/Nacos配置 | ↓ 创建ApplicationContext | ↓ 创建Bean | ↓ Tomcat启动这里:
Environment是什么?
简单理解:
Spring保存配置的地方。
比如:
你的配置:
server: port:8080 jwt: secret:abc最终都会进入:
Environment里面。
然后:
@Value @ConfigurationProperties都是从Environment拿。
六、Nacos Config和Spring Cloud Config插入位置
对比:
Spring Cloud Config
启动 ↓ bootstrap.yml ↓ Config Server ↓ Git ↓ Environment ↓ BeanNacos Config
启动 ↓ bootstrap/application配置 ↓ Nacos Server ↓ Environment ↓ Bean本质:
一样。
区别:
配置存哪里。
七、为什么你感觉Nacos简单?
因为Nacos把很多事情合并了。
例如:
Spring Cloud Config:
Git + Config Server + Config Client三个东西。
Nacos:
Nacos Server 全部包含所以:
你之前学Nacos配置中心:
其实已经理解80%。
现在只是补充:
Spring Cloud原生方案。
八、这个知识为什么重要?
因为以后学:
Sentinel
你会看到:
应用启动 ↓ 加载规则 ↓ 创建保护组件 ↓ 运行也是启动生命周期。
Seata
也是:
服务启动 ↓ 连接TC ↓ 注册RM ↓ 参与事务SkyWalking
也是:
JVM启动 ↓ Agent加载 ↓ 增强字节码 ↓ 监控运行所以:
Spring Boot启动流程是所有框架的基础。
九、你现在应该记住一个简化版
不用背源码。
记:
Spring Boot启动: 1. 找配置 2. 创建环境 3. 创建容器 4. 创建Bean 5. 启动服务 配置中心: 插在第1步和第2步之间。对应:
普通: application.yml Config: bootstrap ↓ Config Server ↓ Git Nacos: bootstrap/application ↓ Nacos到这里,Config的核心思想已经理解。
下一步我们可以进入Spring Cloud Config动态刷新,也就是:
修改配置以后,为什么服务不用重新打包?Spring是怎么重新加载Bean的?
这个会和你之前学的 Nacos@RefreshScope联系起来。