关于java:Spring-Boot-24-新特性启动耗时详细监控

37次阅读

共计 2014 个字符,预计需要花费 6 分钟才能阅读完成。

背景

Spring Boot 我的项目随着我的项目开发过程中引入中间件数量的减少,启动耗时
逐步减少。

笔者在《Spring Boot 2.4.0 正式 GA,全面拥抱云原生》文章评论下发现了

  • Spring 生态简单,非官方插件并未严格按官网规范实现。例如 @Configuration 注解提供了 proxyBeanMethods 属性默认开启,倡议常见状况手动敞开进步性能。笔者在察看大部分非官方插件 stater 并未引入此属性。诸如此类的优化策略很多(倡议翻一下笔者历史博客),但往往被开发者疏忽,导致应用该插件会影响利用启动效率。

  • 启动过程中串行初始化逻辑较多,重大影响启动效率。例如 Druid 数据库连接池初始化设置不合理导致创立物理链接迟缓影响启动效率。

如上两点,我认为 SpringBoot 启动迟缓和框架自身没有太大关系,取决于开发者的能力。如何可能在开发中精确的剖析启动过程,定位到每个耗时操作?单纯从启动日志的维度是无奈实现,Spring Boot 2.4.0 提供了启动过程监控的端点,十分不便的让开发者在开发过程中察看每个组件的初始化过程、耗费工夫等。

上手体验

  • 引入 actuator 依赖
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • 配置裸露 startup 端点
management:
  endpoints:
    web:
      exposure:
        include: startup
  • Main 启动类申明缓冲池,这里留神若利用依赖较多,倡议把 capacity 容量参数设置大些,尽可能的保留全副监控日志。
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {
        // 倡议仅在开发或者排除时开启此配置
        new SpringApplicationBuilder(DemoApplication.class)
                .applicationStartup(new BufferingApplicationStartup(20480))
                .run(args);
    }
}
  • 获取启动数据,POST 申请 /actuator/startup 端点返回监控数据
⋊> ~ 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"}]}}

测试案例

  • 新增 RestTemplate Bean,并模仿初始化耗时
@Configuration(proxyBeanMethods = false)
public class DemoConfiguration {
    @Bean
    public RestTemplate restTemplate() throws InterruptedException {
        // 模仿初始化过程中的耗时操作
        Thread.sleep(5000);
        return new RestTemplate();}
}
  • 获取端点日志, 精确输入在启动过程中初始化 RestTemplate 耗时状况

依据耗时排序

端点接口并未提供相干的接口,而是依照启动加载程序展现。没有必要手动解决获取这些数据排序,能够通过 https://www.bejson.com/json/jsonsort/ 在线格式化排序

抉择依照耗时排序即可

欢送转载!

正文完
 0