启动加速-异步初始化方法

SOFABoot 加快应用启动速度的方式主要有 2 种:

本文介绍如何使用 SOFABoot 异步执行 Bean 的初始化方法以提高应用启动速度。

异步加速原理

在实际使用 Spring/Spring Boot 开发中,一些 Bean 在初始化过程中,会执行一些准备操作,如:

  • 拉取远程配置

  • 初始化数据源

在应用启动期间,这些 Bean 会增加 Spring 上下文刷新时间,导致应用启动耗时变长。

为了加速应用启动,SOFABoot 通过配置可选项,将 Bean 的初始化方法(init-method)使用单独线程异步执行,加快 Spring 上下文加载过程,提高应用启动速度。

异步加速实现

异步初始化 Bean 的原理是开启单独线程负责执行 Bean 的初始化方法(init-method)。实现步骤示例如下:

  1. 引入依赖:在工程的 pom.xml 文件中,引入如下 starter。

    <dependency>
        <groupId>com.alipay.sofa</groupId>
        <artifactId>runtime-sofa-boot-starter</artifactId>
    </dependency>
  2. XML 配置:在 Bean 的 XML 中配置 async-init="true" 属性,用于指定是否异步执行该 Bean 的初始化方法,配置方法见下述示例。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:sofa="http://sofastack.io/schema/sofaboot"
            xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://sofastack.io/schema/sofaboot   http://sofastack.io/schema/sofaboot.xsd"
    default-autowire="byName">
        <!-- async init  test -->
        <bean id="testBean" class="com.alipay.sofa.runtime.beans.TimeWasteBean" init-method="init" async-init="true"/>
    </beans>
  3. 属性配置:SOFABoot 异步初始化能力大小,通过配置线程池大小来体现。线程池用来异步执行 Bean 初始化方法(init-method)。线程池的属性值可以通过下述任一方法来配置。

    • 通过 application.properties 中的两个属性来指定。

      • com.alipay.sofa.boot.asyncInitBeanCoreSize:线程池基本大小,默认值为 CPU 核数加一。

      • com.alipay.sofa.boot.asyncInitBeanMaxSize:线程池中允许的最大线程数大小,默认值为 CPU 核数加一。

    • 通过 VM -D 参数来设置。