• 「Spring Boot 2.4 新特性」启动耗时详细监控


    背景

    Spring Boot 项目随着项目开发过程中引入中间件数量的增加,启动耗时
    逐渐增加。

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

    • Spring 生态复杂,非官方插件并未严格按官方标准实现。例如 @Configuration 注解提供了 proxyBeanMethods 属性默认开启,建议常见情况手动关闭提高性能。笔者在观察大部分非官方插件 stater 并未引入此属性。诸如此类的优化策略很多(建议翻一下笔者历史博客),但往往被开发者忽略,导致使用该插件会影响应用启动效率。

    如上两点,我认为 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/ 在线格式化排序

    选择按照耗时排序即可

    项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

    欢迎转载!

  • 相关阅读:
    使用纯 CSS 实现响应式的图片显示效果
    10个帮助你快速调试和排错的小技巧
    《JavaScript 实战》:JavaScript 实现拖拽缩放效果
    周末发福利了!26个免费的HTML5模版
    程序人生的四个象限和两条主线
    50份简历设计,助你找到梦寐以求的工作
    6个重构方法可帮你提升 80% 的代码质量
    开发者必须收藏的6款源码搜索引擎
    常用的20个强大的 Sublime Text 插件
    你知道吗?.NET Framework 4.5 五个很棒的特性
  • 原文地址:https://www.cnblogs.com/leng-leng/p/14107416.html
Copyright © 2020-2023  润新知