背景Spring Boot 項(xiàng)目隨著項(xiàng)目開發(fā)過程中引入中間件數(shù)量的增加,啟動(dòng)耗時(shí)
如上兩點(diǎn),我認(rèn)為 SpringBoot 啟動(dòng)緩慢和框架本身沒有太大關(guān)系,取決于開發(fā)者的能力。如何能夠在開發(fā)中準(zhǔn)確的分析啟動(dòng)過程,定位到每個(gè)耗時(shí)操作? 單純從啟動(dòng)日志的維度是無法實(shí)現(xiàn),Spring Boot 2.4.0 提供了啟動(dòng)過程監(jiān)控的端點(diǎn),非常方便的讓開發(fā)者在開發(fā)過程中觀察每個(gè)組件的初始化過程、消耗時(shí)間等。 上手體驗(yàn)
<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) { // 建議僅在開發(fā)或者排除時(shí)開啟此配置 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"}]}} 測(cè)試案例
@Configuration(proxyBeanMethods = false) public class DemoConfiguration { @Bean public RestTemplate restTemplate() throws InterruptedException { // 模擬初始化過程中的耗時(shí)操作 Thread.sleep(5000); return new RestTemplate(); } }
根據(jù)耗時(shí)排序端點(diǎn)接口并未提供相關(guān)的接口,而是按照啟動(dòng)加載順序展示。沒有必要手動(dòng)處理獲取這些數(shù)據(jù)排序,可以通過 https://www./json/jsonsort/ 在線格式化排序 選擇按照耗時(shí)排序即可 |
|