背景Spring Boot 项目随着项目开发过程中引入中间件数量的增加,启动耗时
如上两点,我认为 SpringBoot 启动缓慢和框架本身没有太大关系,取决于开发者的能力。如何能够在开发中准确的分析启动过程,定位到每个耗时操作? 单纯从启动日志的维度是无法实现,Spring Boot 2.4.0 提供了启动过程监控的端点,非常方便的让开发者在开发过程中观察每个组件的初始化过程、消耗时间等。 上手体验
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
management: endpoints: web: exposure: include: startup
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { // 建议仅在开发或者排除时开启此配置 new SpringApplicationBuilder(DemoApplication.class) .applicationStartup(new BufferingApplicationStartup(20480)) .run(args); } }
⋊> ~ curl -XPOST http://localhost:8080/actuator/startup 11:49:51 {"springBootVersion":"2.4.0","timeline":{"startTime":"2020-12-04T01:38:15.028114Z","events":[{"startupStep":{"name":"spring.event.invoke-listener","id":296,"parentId":0,"tags":[{"key":"event","value":"ServletRequestHandledEvent: url=[/actuator/startup]; client=[0:0:0:0:0:0:0:1]; method=[POST]; servlet=[dispatcherServlet]; session=[null]; user=[null]; time=[83ms]; status=[OK]"},{"key":"listener","value":"org.springframework.boot.context.config.DelegatingApplicationListener@2053d869"}]},"startTime":"2020-12-04T01:38:28.402870279Z","endTime":"2020-12-04T01:38:28.402929390Z","duration":"PT0.000059111S"}]}} 测试案例
@Configuration(proxyBeanMethods = false) public class DemoConfiguration { @Bean public RestTemplate restTemplate() throws InterruptedException { // 模拟初始化过程中的耗时操作 Thread.sleep(5000); return new RestTemplate(); } }
根据耗时排序端点接口并未提供相关的接口,而是按照启动加载顺序展示。没有必要手动处理获取这些数据排序,可以通过 https://www./json/jsonsort/ 在线格式化排序 选择按照耗时排序即可 |
|