Spring 启动过程耗时监测

Last Modified: 2023/05/06

概述

随着 spring 项目规模的增大,依赖越来越多,自动化配置越来越多,bean 越来越多,不知从何时起,项目启动越来越慢,终于有一天你忍受不了了,经过一番搜索之后,你来到了这里。

这篇文章的目的便是教大家利用 spring boot startup actuator 来监测 spring 项目启动的各个阶段所花费的时间。知道了各个阶段的耗时,便可以对那些慢的阶段做针对性的优化。

准备阶段

1、 首先引入 actuator 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、 之后需要对 spring boot 项目的 main 方法进行一些改造,在改造之前,spring boot 项目的 main 方法一般是这样的:

public static void main(String[] args) {
  SpringApplication.run(OwesomeApplication.class, args);
}

改造的方法很简单,只需要给 application 对象设置一个 ApplicationStartup 对象即可,spring 也提供了该对象的一个实现类 BufferingApplicationStartup,该类可以缓存各个启动步骤的耗时。改造后的 main 方法实现如下:

public static void main(String[] args) {
  SpringApplication application = new SpringApplication(OwesomeApplication.class);
  application.setApplicationStartup(new BufferingApplicationStartup(1000));
  application.run(args);
}

new BufferingApplicationStartup(1000) 设置了最大缓存条目的数量为 1000,可以根据项目的规模酌情增大或者减小。

3、 最后我们还要开放监控端点,在 application.properties 中配置:

management.endpoints.web.exposure.include=startup

到这里,准备阶段已经全部完成,接下来便是启动项目,访问 /actuator/starup 端点查看耗时情况。

查看 startup 端点

在浏览器访问 http://localhost:8080/actuator/starup,请根据端口的实际情况修改后再访问。以下截取了作者电脑上该端点部分响应的内容如下:

{
  "endTime": "2023-05-03T03:57:26.291Z",
  "duration": "PT5.316S",
  "startTime": "2023-05-03T03:57:20.975Z",
  "startupStep": {
    "name": "spring.beans.instantiate",
    "id": 191,
    "tags": [
      {
        "key": "beanName",
        "value": "ossClient"
      },
      {
        "key": "beanType",
        "value": "interface com.aliyun.oss.OSS"
      }
    ],
    "parentId": 190
  }
}

可以看到,ossClient 这个 bean 的初始化 duration(耗时) 为 5.316S,这显然相当不正常,最后将 ossClient 这个 bean 加上 @Lazy 注解延迟初始化,并在注入该 bean 的地方也加上 @Lazy 注解,解决了该 bean 初始化时间过长的问题。

总结

本文讲述了如何利用 spring boot actuator startup 监测项目启动过程中各个阶段的耗时,虽然每个项目启动慢的原因不尽相同,解决办法也不可能相同,但是只要我们能定位到慢的地方,解决自然不成问题。

有问题吗?点此反馈!

温馨提示:反馈需要登录