Spring Boot与Spring Cloud应用启动流程是什么

发布时间:2021-11-12 16:03:24 作者:iii
来源:亿速云 阅读:208
# 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);
    }
}

1.2 SpringApplication初始化

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方法所在类)

1.3 运行阶段

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;
}

1.4 自动配置原理

@SpringBootApplication包含@EnableAutoConfiguration,其核心是:

  1. 加载META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  2. 通过@Conditional系列注解进行条件过滤
  3. 创建符合条件的Bean

二、Spring Cloud应用启动流程

2.1 核心组件初始化

Spring Cloud在Spring Boot基础上增加了以下初始化步骤:

  1. Bootstrap上下文(Spring Cloud 2020+已默认禁用)

    • 优先加载bootstrap.yml/properties
    • 通过BootstrapApplicationListener触发
  2. 环境准备增强

    // 加载额外的PropertySource
    environment.getPropertySources().addFirst(...);
    
  3. 健康检查初始化

    // 通过HealthIndicatorAutoConfiguration
    @Bean
    public HealthIndicator discoveryClientHealthIndicator(...)
    

2.2 服务注册流程(以Nacos为例)

// NacosServiceRegistry自动注册流程
public void register(Registration registration) {
    // 1. 构建实例信息
    Instance instance = buildInstance(registration);
    
    // 2. 调用Nacos OpenAPI注册
    namingService.registerInstance(
        serviceId, 
        instance
    );
}

2.3 配置中心初始化(以Config为例)

// 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/磁盘检查 增加注册中心、配置中心健康指标

四、典型启动日志分析

4.1 Spring Boot启动日志片段

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)

4.2 Spring Cloud增加日志

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

五、启动优化建议

  1. 组件懒加载

    @Bean
    @Lazy
    public FeignClient feignClient() {...}
    
  2. 排除自动配置

    @SpringBootApplication(exclude = {
       DataSourceAutoConfiguration.class
    })
    
  3. 日志级别控制

    logging:
     level:
       org.springframework.cloud: WARN
       com.netflix: ERROR
    
  4. JVM参数优化

    -XX:TieredStopAtLevel=1
    -Xverify:none
    

六、总结

Spring Boot启动流程核心是: 1. 环境准备 → 上下文创建 → 自动配置 → 容器启动

Spring Cloud在此基础上: 1. 增加Bootstrap阶段 2. 集成分布式组件 3. 动态配置管理 4. 服务注册发现

掌握这些启动机制有助于: - 更高效地排查启动问题 - 合理设计应用初始化顺序 - 优化应用启动速度 “`

注:本文实际约1600字,可根据需要补充以下内容扩展: 1. 特定组件(如Gateway、Sentinel)的启动细节 2. 启动故障的典型案例分析 3. 与Kubernetes探针的集成方式 4. 自定义启动扩展点的实现示例

推荐阅读:
  1. Spring Cloud是什么
  2. Spring -> Spring Boot > Spring Cloud

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring boot spring cloud

上一篇:怎么理解web开发中的分布式事务

下一篇:Django中的unittest应用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》