Java 程序员越来越多的依赖于 Spring 框架,几乎大一点的 web 项目,基本上就没离开过 Spring。无论是从 jsp 时代,还是到现在的前后端分类时代,也或者是低代码、AI 时代,都有 Spring 的影子。

Spring 框架带来便捷的同时,也延缓了 Java 项目的启动时间。不少项目,不管是单体还是微服务模式,随着业务的膨胀,Spring 项目启动时间会越来越久。以至于有些项目启动时间得好几分钟。

于是,就有不少网友给 Spring 留言,提 issue,什么时候支持多线程启动啊?官方从好几年前一直拖到现在,终于对这一块有想法了。多线程初始化 bean 已经和大家见面了,不久的将来,大家升级到最新的版本,应该就能使用上了。

但是,项目版本升级,一直以来都是一项大工程。那么如何提升现有 Spring 项目的启动时间呢?本文提供一些思路,供大家参考!

懒加载

延迟初始化,也就是懒加载。实际上,大部分 bean 都是可以使用懒加载的。只不过很少有程序员会这样用。

所以,不到万不得已,应该会很少有人专门使用 @Lazy 注解来标记需要延迟初始化的 bean,从而减少启动时间和内存消耗。

批量延迟初始化

如果你的 SpringBoot 版本比较高,那么可以使用到 SpringBoot 的新特性。即,使用它的快速启动模式。

spring.main.lazy-initialization=true

改模式,可以明显的减少应用程序的启动时间。

减少要扫描的类

如果,扫描的类太多,也会延缓启动时间。能缩小范围,就缩小范围。一定不要扩大要扫描的范围。

比如,要扫描com.xttblog.config包里的类,就指定扫这个包,没必要配置成扫描comcom.xttblog包。

总之就是不要管的太宽,也不要没事找事的去多扫描。

减少没必要的bean

不使用的 bean,就不要初始化创建它。能用工具类替换的,就使用工具类。

能用充血模型,就使用充血模型。功能重复的类,就抽离成一个 bean。

总之,就是要克制,做熵减的事情。

减少bean依赖

某些使用率比较低的 bean,建议使用懒加载。还有一个类,不要过多的依赖其他 bean,单一原则。

还有就是尽可能的多使用 SpringUtil,不直接引入 bean,而是在某些调用频次低,充血模型中,通过 SpringUtil 工具类来查找 bean,调用对应的 bean 方法。

减少依赖项

没用到的依赖,就不要引入了。比如,我使用 mysql 数据库,那就没必要引入 oracle 的驱动。比如,我使用了 rabbitmq 了,就没必要再引入其他 mq 了,尤其是那些能自动装配的各种 Stater。

从源头就给它控制了,把非必须的依赖项,全部删除。

其它的,我们还可以选择更轻量级的替代品或自定义的实现,以减少依赖项的数量和大小。

优化自动配置

Spring Boot提供了自动配置机制,根据应用程序的依赖项和配置,自动配置各种组件。但有时这可能导致过多的自动配置,影响启动速度。通过检查和优化自动配置,可以减少不必要的组件初始化和加载,提高启动速度。

我们可以使用@EnableAutoConfiguration注解的exclude属性来排除特定的自动配置类。

减少业务初始化

尽量减少不必要的业务依赖和初始化逻辑,例如数据库连接、Redis 连接等,异步化这些操作可以减少启动时间。

减少服务间的依赖

尽量减少服务间的依赖,尤其是网络间通讯。

服务间的依赖,还对编排有影响。

搞不好,别人的服务故障,还会导致你的服务不可用。这在架构设计上也是大忌,比如我 user 服务启动,没必要去调用、通知 order 服务。我网关服务的启动,也没必要通知到其他各个服务。

减少彼此之间的依赖,还每个服务应有的自由。

增加硬件性能

好的硬件,肯定能加快启动。

比如,机械硬盘更换为 ssd 硬盘。1m 的带宽,增加到 5m。1 核的低频 CPU,增加到 2 核的高频 CPU。

能花钱解决的,就花钱解决。因为花钱可能见效更快。

合理的设置JVM内存

我记得之前有一个微信群友说,他 1m 能启动一个 SpringBoot 项目,大家都不相信,让他给证据。

后来,他截图了,他初始化内存给了 1m,最大内存给了 1024m,然后得出了 1m 内存启动了 SpringBoot 项目。

这里面有些知识,他可能不懂。给 JVM 初始化的内存,不够时,再没到最大内存时,它是可以扩容的。为了减少扩容,可以像优化 map 一样,给它一步设置到位。

调整日志级别

在项目启动时,尽量把日志级别提高,减少日志打印。

另外,更不好使用 System.out 去打印日志,因为它会串行化。

将日志级别调整为更高的级别,如将 DEBUG 调整为 INFO,将 INFO 调整为 WARN 等,减少日志输出,缩短启动时间。

以上,总结的可能不全。但核心思想就是做减法,非必要不得不的尽量不初始化或加载它,尽可能的给启动项目,优化启动时间让路。

有些人可能没见过一个项目光启动一下就要 10 分钟的。见的多了,你就知道时间珍贵了。

最后,今天是六一儿童节,祝大家节日快乐,永远年轻,永远童心!

本篇文章来源于微信公众号: 业余草



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-08-01