Spring 启动过程耗时监测
概述
随着 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 监测项目启动过程中各个阶段的耗时,虽然每个项目启动慢的原因不尽相同,解决办法也不可能相同,但是只要我们能定位到慢的地方,解决自然不成问题。
温馨提示:反馈需要登录