springboot 启动速度优化备忘

  |   0 评论   |   1,114 浏览

目前我们的微服务启动速度都谈不上快. 在添加了预热之后启动速度会更加的感人. 这个原因通过研究以及行业相关的解决方案.

注: 这里所说的方法,都是以类加载速度瓶颈优化展开的. 这个是已经在使用工具.如 async-profiler此类的工具对启动速度进行了定位分析后的优化方向.
对于SpringBoot 本身

目前可能解决办法有:

以上三种方法,各有各的优点. 如果是最正统的做法,肯定是直接升级到2.x. 但是这个有成本不好实施. 如果使用jarindex这个实际就是2.x的官方已经有的实现. 因此也比较折腾最后可能没有官方的好. 现在最省成本的办法就是直接使用main启动了. 这个可以参考 spring-boot-loader的launcher的代码.

参考源码: https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/JarLauncher.java

大概可以了解到其原理, 就是在spring启动的时候先启动的不是main class .而是启动的 launcher类. 而launcher类会对使用改造过的 URLClassLoader 来完成对类的加载.

这个改造过的ClassLoader会对 SpringBootFatJar进行预处理. 对里面已经存在的嵌套Jar包进行读取与索引处理. 以便后后面在真正进行ClassLoad的时候,能够查找到正确的类进行加载.

具体可以参考:

使用MainClass直接启动的原理与可行性:

并不是一开始我们就找到了官方的文档说明. 这个是从我们的实际项目在Idea中调试时发现的时间差异. 最后对比发现是类的加载方式的差异造成的启动速度的差异.

这里有一个官方镜像的相关说明: https://docs.spring.io/spring-boot/docs/current/reference/html/container-images.html

WeChatWorkScreenshot82388e7c34ea432a8e429c2fddd15a8a.png

我们对比了某solar-xxx 服务在 macbookpro 2020 上的运行时间差异.

  • 使用java -jar xxx.jar 运行的速度大概是 120秒的启动时间.
  • 把xxx.jar 解压后直接使用 laucher类启动. 其启动时间几乎没有变化.
  • 直接启动 MainClass , 此种启动方法的启动时间大概能提升到 60秒左右. 几乎是一倍时间的差异.

评论

发表评论


取消