嘉兴市建设街道网站,网站内容管理系统cms,潍坊市建设局官方网站,湖南长沙旅游十大必去景区问题背景最近在负责一个订单系统的业务研发#xff0c;本来不是件困难的事。但是服务的启动时间很慢#xff0c;慢的令人发指。单次启动的时间约在10多分钟左右#xff0c;基本一次迭代、开发#xff0c;大部分的时间都花在了启动项目上。忍无可忍的我#xff0c;终于决定…问题背景最近在负责一个订单系统的业务研发本来不是件困难的事。但是服务的启动时间很慢慢的令人发指。单次启动的时间约在10多分钟左右基本一次迭代、开发大部分的时间都花在了启动项目上。忍无可忍的我终于决定找到启动慢的原因。方案探索起初对于优化项目启动速度是毫无头绪。也是傻傻的从百度上去搜解决的方案。一下子就搜到了Jprofiler这个软件据说是能快速找到错误栈的位置。但是不得不说这软件真的很坑不仅收费MAC破解巨难找找到了还打不开而且实际因为很多Spring类都是采用动态代理加载的Jprofiler根本判断不出来错误位置在哪。尝试Jprofiler无果后从网上还看到了一个另外的方法可以通过对运行中的线程作快照来定位是否存在有死循环的线程。进而优化启动速度。采用Thread dump的方式比较适合你清楚大致原因的时候使用否则你盲目的去截取到的线程实际上也很难定位是不是当前线程的问题。尽管错误栈很全但意味着你需要了解的源码更深。对我这种小白依旧很难get到具体的原因。深入钻研采用网上的解决方案都无疾而终后决定还是采用最笨的方法解决就一点点的debug吧于是在SpringBoot的启动类org.springframework.boot.SpringApplication#run上打满了debug点逐个关键的debug点去调试。尽管方案很笨也很耗时启动一次基本10分钟左右。但是很快定位到了启动缓慢的原因。在Springboot的BEAN后处理器的加载方法中有一个关键的Bean容器DSLContext启动及其的慢大概需要6、7分钟左右。org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization然而dslContext是个啥玩意他为啥又让我的系统启动慢了呢带着疑惑又搜了一遍百度直到看到了这篇文章。https://www.jianshu.com/p/f65653a0f11c 。文章里写到dslContext启动慢的原因主要是有个AnnotationAwareAspectJAutoProxyCreator的处理器该处理器会扫描dslContext中的方法并逐一判断当前的方式是否需要动态代理。dslContext中包含约800的方法启动自然会很慢。最终解决知道了原因那么自然也就知道了解决方案。只要让Springboot不扫描到这个dslContext组件了那么就可以加快启动速度了不是那么自然就可以从两个角度出发
1、修改Springboot的扫描范围不扫描即可
2、不导入dslContext的依赖包让Springboot扫描不到我首先尝试了第一种方法修改了启动类上ComponentScan和EnableFeignClients的两个注解的扫描范围然而无论我怎么修改实际上都没有生效。大概率猜测是因为dslContext并不是采用Componet注解的方式而是采用Configuration注入的方式导致。无奈之下只能按照第二种思路去考虑解决方案。然而作为一个饱经风霜的项目maven依赖多到数不清根本不知道该从何下手。
尝试通过Maven Helper插件去搜索dslContext的maven依赖却也是毫无作用。
PS这里不得不提一下Maven Helper这个插件这个插件可以很快找到我们所依赖的maven是我平日用来排除相关依赖的利器。也就是抱着尝试的心态在百度下搜索了一下“使用dslContext”的关键字很幸运的是在第二个搜索位置跳出了jooq这个名词。于是怀疑是不是这个jooq依赖把dslContext导入进来了呢尝试着一搜果然毫不犹豫点击了exclude再启动一次。问题解决经验总结解决项目启动慢的原因其实是个很依靠个人经验和运气、玄学的过程但是还是有一些方法有迹可循。
1、可以考虑Jprofiler去记录线程的启动时间。但本次效果不佳可能需要更正常的打开方式
2、可以考虑采用截取线程快照的方式定位。
3、最最笨的方法就是采用Debug的方式定位。
在定位到具体的启动缓慢的原因后如果是因为注入的问题有下面两条解决思路
1、不扫描对应的Component组件可以通过修改Component、EnableFeignClients的basePackge参数来控制。
2、如果上述的参数没有生效可以考虑尝试百度定位引入这个组件的maven依赖是什么并借助Maven Helper插件将该依赖排除。