摘要:
springboot启动时,配置读取发生在bean创建之前,确保依赖配置的bean能正确初始化。加入nacos/springcloudconfig后,流程变为:先通过bootstrap.yml获取配置中心地址(避免循环依赖),再拉取远程配置合并到环境变量(environment),最后创建bean。nacos简化了架构(内置配置管理),而springcloudconfig需独立git+configserver。两者均通过bootstrap阶段(类似bios)引导配置加载,核心思想是先定位配置源,再构建应用上下文。这一机制是sentinel、seata等框架动态配置的基础,后续可结合@refreshscope理解动态刷新原理。
好的,我们这一节专门解决你刚才卡住的核心:
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 ↓ bean
nacos 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 联系起来。
以上就是springboot启动流程与配置读取全解析的详细内容,更多关于springboot启动流程与配置读取的资料请关注代码网其它相关文章!
发表评论