您好,登录后才能下订单哦!
# Spring Boot与Spring Cloud应用启动流程解析
## 一、Spring Boot应用启动流程
### 1.1 启动入口
Spring Boot应用的启动入口是`main()`方法,通常带有`@SpringBootApplication`注解:
```java
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
SpringApplication.run()
内部会创建SpringApplication
实例:
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
return new SpringApplication(primarySource).run(args);
}
初始化阶段主要完成:
1. 推断应用类型(Servlet/Reactive)
2. 通过SpringFactoriesLoader
加载META-INF/spring.factories
中的:
- ApplicationContextInitializer
- ApplicationListener
3. 推断主配置类(通过main方法所在类)
run()
方法执行流程:
public ConfigurableApplicationContext run(String... args) {
// 1. 启动计时器
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 2. 准备环境
ConfigurableEnvironment environment = prepareEnvironment(...);
// 3. 打印Banner
Banner printedBanner = printBanner(environment);
// 4. 创建应用上下文
context = createApplicationContext();
// 5. 准备上下文
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
// 6. 刷新上下文(核心)
refreshContext(context);
// 7. 启动后处理
afterRefresh(context, applicationArguments);
// 8. 触发启动完成事件
listeners.started(context);
callRunners(context, applicationArguments);
stopWatch.stop();
return context;
}
@SpringBootApplication
包含@EnableAutoConfiguration
,其核心是:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@Conditional
系列注解进行条件过滤Spring Cloud在Spring Boot基础上增加了以下初始化步骤:
Bootstrap上下文(Spring Cloud 2020+已默认禁用)
bootstrap.yml/properties
BootstrapApplicationListener
触发环境准备增强
// 加载额外的PropertySource
environment.getPropertySources().addFirst(...);
健康检查初始化
// 通过HealthIndicatorAutoConfiguration
@Bean
public HealthIndicator discoveryClientHealthIndicator(...)
// NacosServiceRegistry自动注册流程
public void register(Registration registration) {
// 1. 构建实例信息
Instance instance = buildInstance(registration);
// 2. 调用Nacos OpenAPI注册
namingService.registerInstance(
serviceId,
instance
);
}
// PropertySourceLocator实现类
public PropertySource<?> locate(Environment env) {
// 1. 从远程配置中心获取配置
ConfigClientProperties properties = this.defaultProperties;
String[] labels = new String[]{...};
// 2. 组装PropertySource
CompositePropertySource composite = new CompositePropertySource(...);
// 3. 返回动态配置
return composite;
}
阶段 | Spring Boot | Spring Cloud增强点 |
---|---|---|
环境准备 | 加载application.yml | 增加bootstrap.yml,远程配置中心接入 |
Bean初始化 | 自动配置+条件装配 | 增加服务发现、熔断器等云组件 |
上下文启动 | 标准Servlet容器启动 | 服务注册、配置监听等后处理 |
健康检查 | 基础DB/磁盘检查 | 增加注册中心、配置中心健康指标 |
2023-07-20 14:30:00.123 INFO [main] o.s.b.w.e.t.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
2023-07-20 14:30:00.456 INFO [main] o.s.j.e.a.AnnotationMBeanExporter - Registering beans for JMX exposure
2023-07-20 14:30:01.789 INFO [main] c.e.MyApp - Started MyApp in 2.305 seconds (JVM running for 3.027)
2023-07-20 14:30:00.555 INFO [main] c.a.c.n.registry.NacosServiceRegistry - Registering service with nacos...
2023-07-20 14:30:01.234 INFO [main] b.c.PropertySourceBootstrapConfiguration - Located property source: CompositePropertySource
2023-07-20 14:30:02.111 INFO [main] o.s.c.n.e.EurekaAutoServiceRegistration - Updating port to 8080
组件懒加载
@Bean
@Lazy
public FeignClient feignClient() {...}
排除自动配置
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
日志级别控制
logging:
level:
org.springframework.cloud: WARN
com.netflix: ERROR
JVM参数优化
-XX:TieredStopAtLevel=1
-Xverify:none
Spring Boot启动流程核心是: 1. 环境准备 → 上下文创建 → 自动配置 → 容器启动
Spring Cloud在此基础上: 1. 增加Bootstrap阶段 2. 集成分布式组件 3. 动态配置管理 4. 服务注册发现
掌握这些启动机制有助于: - 更高效地排查启动问题 - 合理设计应用初始化顺序 - 优化应用启动速度 “`
注:本文实际约1600字,可根据需要补充以下内容扩展: 1. 特定组件(如Gateway、Sentinel)的启动细节 2. 启动故障的典型案例分析 3. 与Kubernetes探针的集成方式 4. 自定义启动扩展点的实现示例
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。