「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權限管理系統 歡迎關注

歡迎轉載!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章