自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

太全了!Spring Boot 3.4 七種方法耗時(shí)統(tǒng)計(jì)實(shí)現(xiàn),一文搞定!

開(kāi)發(fā) 前端
在性能優(yōu)化的世界里,有一句老話:“你無(wú)法優(yōu)化你不了解的東西(You can't improve what you don't measure)”。無(wú)論是對(duì)接口響應(yīng)的監(jiān)控、還是對(duì)業(yè)務(wù)邏輯執(zhí)行效率的衡量,方法耗時(shí)統(tǒng)計(jì)都是系統(tǒng)調(diào)優(yōu)的重要基石。

在日常開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到系統(tǒng)響應(yīng)變慢、頁(yè)面加載遲緩、接口卡頓等問(wèn)題,而這些問(wèn)題背后隱藏的往往是方法級(jí)性能瓶頸。隨著系統(tǒng)的不斷復(fù)雜化,代碼邏輯日益龐大,如何精準(zhǔn)定位耗時(shí)點(diǎn),及時(shí)發(fā)現(xiàn)并優(yōu)化這些“隱形殺手”,已成為后端開(kāi)發(fā)的基本功。

尤其是在 Spring Boot 3.4 日趨成熟、廣泛應(yīng)用于微服務(wù)架構(gòu)的背景下,開(kāi)發(fā)者對(duì)方法執(zhí)行時(shí)間的可觀測(cè)性性能數(shù)據(jù)的可量化性提出了更高要求。

本篇文章將以 com.icoderoad 作為標(biāo)準(zhǔn)業(yè)務(wù)包路徑,系統(tǒng)梳理 七種在Spring Boot 3.4項(xiàng)目中統(tǒng)計(jì)方法執(zhí)行耗時(shí)的主流實(shí)現(xiàn)方案,從最基礎(chǔ)的 StopWatch 手動(dòng)記錄,到高級(jí)的 AOP 切面、再到生產(chǎn)級(jí)的 Micrometer + Actuator 監(jiān)控體系,全方位覆蓋應(yīng)用開(kāi)發(fā)中的各類(lèi)場(chǎng)景,助你輕松搞定耗時(shí)統(tǒng)計(jì),提升系統(tǒng)穩(wěn)定性與可維護(hù)性!

方式一:最簡(jiǎn)單直接 —— StopWatch手動(dòng)計(jì)時(shí)

這種方式適用于臨時(shí)調(diào)試,定位具體代碼塊性能問(wèn)題時(shí)很好用。

package com.icoderoad.service;


import org.springframework.stereotype.Service;
import org.springframework.util.StopWatch;


@Service
public class UserService {


    public User findById(Long id) {
        StopWatch watch = new StopWatch();
        watch.start();


        // 模擬業(yè)務(wù)操作
        User user = userRepository.findById(id).orElse(null);


        watch.stop();
        System.out.println("findById 執(zhí)行耗時(shí):" + watch.getTotalTimeMillis() + "ms");
        return user;
    }
}

優(yōu)勢(shì):無(wú)需配置、上手簡(jiǎn)單

劣勢(shì):代碼侵入性強(qiáng),不適合全局使用

方式二:面向切面 —— AOP統(tǒng)一攔截統(tǒng)計(jì)

借助 Spring AOP,可以無(wú)感知地實(shí)現(xiàn)方法耗時(shí)采集。

首先,添加 AOP 依賴(lài):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

切面實(shí)現(xiàn)如下:

package com.icoderoad.aspect;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;


@Aspect
@Component
public class PerformanceAspect {


    @Pointcut("execution(* com.icoderoad.service..*(..))")
    public void serviceMethods() {}


    @Around("serviceMethods()")
    public Object logTime(ProceedingJoinPoint joinPoint) throws Throwable {
        StopWatch sw = new StopWatch();
        sw.start();


        Object result = joinPoint.proceed();


        sw.stop();
        System.out.println("方法【" + joinPoint.getSignature() + "】耗時(shí):" + sw.getTotalTimeMillis() + "ms");
        return result;
    }
}

優(yōu)勢(shì):完全無(wú)侵入,集中管理

劣勢(shì):粒度控制較弱,不適合只監(jiān)控個(gè)別方法

方式三:自定義注解 + AOP,精準(zhǔn)掌控要點(diǎn)

如果你只想統(tǒng)計(jì)某些特定方法的耗時(shí),又不想在方法里寫(xiě)邏輯,推薦這種方式。

注解定義:

package com.icoderoad.annotation;


import java.lang.annotation.*;


@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TrackTime {
    String description() default "";
}

切面處理類(lèi):

package com.icoderoad.aspect;


import com.icoderoad.annotation.TrackTime;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;


@Aspect
@Component
public class TrackTimeAspect {


    @Around("@annotation(com.icoderoad.annotation.TrackTime)")
    public Object handleTimedMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        TrackTime annotation = signature.getMethod().getAnnotation(TrackTime.class);


        String desc = annotation.description().isEmpty() ? signature.getMethod().getName() : annotation.description();


        StopWatch sw = new StopWatch();
        sw.start();


        Object result = joinPoint.proceed();


        sw.stop();
        System.out.println("方法[" + desc + "]執(zhí)行時(shí)間:" + sw.getTotalTimeMillis() + "ms");
        return result;
    }
}

使用方法:

package com.icoderoad.service;


import com.icoderoad.annotation.TrackTime;
import org.springframework.stereotype.Service;


@Service
public class ProductService {


    @TrackTime(description = "獲取商品詳情")
    public Product getProductById(Long id) {
        return productRepository.findById(id).orElse(null);
    }
}

優(yōu)勢(shì):可控性高、便于擴(kuò)展

劣勢(shì):仍需手動(dòng)打注解

方式四:Spring Interceptor —— 專(zhuān)注于Controller層

如果你只關(guān)心 Web 層接口的耗時(shí)統(tǒng)計(jì),用攔截器最合適不過(guò)了。

攔截器類(lèi):

package com.icoderoad.interceptor;


import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.*;


@Component
public class ApiTimerInterceptor implements HandlerInterceptor {


    private final ThreadLocal<Long> startTime = new ThreadLocal<>();


    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
        startTime.set(System.currentTimeMillis());
        return true;
    }


    @Override
    public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception ex) {
        long duration = System.currentTimeMillis() - startTime.get();
        System.out.println("接口【" + req.getRequestURI() + "】耗時(shí):" + duration + "ms");
        startTime.remove();
    }
}

注冊(cè)攔截器:

package com.icoderoad.config;


import com.icoderoad.interceptor.ApiTimerInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;


@Configuration
public class WebMvcConfig implements WebMvcConfigurer {


    private final ApiTimerInterceptor interceptor;


    public WebMvcConfig(ApiTimerInterceptor interceptor) {
        this.interceptor = interceptor;
    }


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(interceptor).addPathPatterns("/api/**");
    }
}

優(yōu)勢(shì):Web接口性能監(jiān)控利器

劣勢(shì):無(wú)法統(tǒng)計(jì) Service 等后端業(yè)務(wù)層邏輯

方式五:Actuator + Micrometer + Prometheus,專(zhuān)業(yè)級(jí)監(jiān)控搭檔

適合部署到生產(chǎn)環(huán)境,通過(guò)可視化儀表盤(pán)統(tǒng)一查看性能數(shù)據(jù)。

添加依賴(lài):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

服務(wù)類(lèi)中記錄方法時(shí)間:

package com.icoderoad.service;


import io.micrometer.core.instrument.*;
import org.springframework.stereotype.Service;


@Service
public class OrderService {


    private final MeterRegistry registry;


    public OrderService(MeterRegistry registry) {
        this.registry = registry;
    }


    public Order createOrder(OrderRequest request) {
        Timer.Sample sample = Timer.start(registry);


        Order order = process(request); // 假設(shè)業(yè)務(wù)邏輯處理


        sample.stop(registry.timer("order.create.time"));
        return order;
    }
}

配置 application.yml 暴露端點(diǎn):

management:
  endpoints:
    web:
      exposure:
        include: prometheus,metrics
  metrics:
    export:
      prometheus:
        enabled: true

優(yōu)勢(shì):配合Grafana視圖完美呈現(xiàn),適合線上

 劣勢(shì):配置偏復(fù)雜,對(duì)初學(xué)者門(mén)檻較高

方式六:Filter 過(guò)濾器方式,全鏈路請(qǐng)求計(jì)時(shí)

最適合做網(wǎng)關(guān)、統(tǒng)一入口類(lèi)應(yīng)用的方式之一。

package com.icoderoad.filter;


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import java.io.IOException;


@Component
public class RequestTimingFilter implements Filter {


    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        long begin = System.currentTimeMillis();


        chain.doFilter(request, response);


        long duration = System.currentTimeMillis() - begin;
        String uri = ((HttpServletRequest) request).getRequestURI();
        System.out.println("請(qǐng)求[" + uri + "]總耗時(shí):" + duration + "ms");
    }
}

優(yōu)勢(shì):全局統(tǒng)計(jì)請(qǐng)求,零業(yè)務(wù)侵入

劣勢(shì):無(wú)法細(xì)分業(yè)務(wù)邏輯耗時(shí)

方式七:事件監(jiān)聽(tīng)器 —— 輕松統(tǒng)計(jì)請(qǐng)求執(zhí)行時(shí)間

使用 Spring 自帶的事件 ServletRequestHandledEvent,簡(jiǎn)單高效。

package com.icoderoad.listener;


import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.ServletRequestHandledEvent;


@Component
public class HttpRequestListener implements ApplicationListener<ServletRequestHandledEvent> {


    @Override
    public void onApplicationEvent(ServletRequestHandledEvent event) {
        System.out.println("請(qǐng)求【" + event.getRequestUrl() + "】處理時(shí)長(zhǎng):" + event.getProcessingTimeMillis() + "ms");
    }
}

優(yōu)勢(shì):無(wú)侵入、自動(dòng)觸發(fā)

劣勢(shì):僅限于Controller層,無(wú)法擴(kuò)展具體邏輯耗時(shí)

最后總結(jié):七種方案對(duì)比參考

方式

優(yōu)勢(shì)

劣勢(shì)

場(chǎng)景推薦

StopWatch

快速上手

代碼侵入強(qiáng)

臨時(shí)測(cè)試、調(diào)優(yōu)

AOP

全局統(tǒng)一、代碼無(wú)侵入

粒度不夠細(xì)

Service層整體監(jiān)控

注解 + AOP

靈活定制、擴(kuò)展性強(qiáng)

需手動(dòng)打標(biāo)記

關(guān)鍵方法性能采集

攔截器 Interceptor

專(zhuān)注接口、配置簡(jiǎn)潔

僅限Controller層

Web接口性能分析

Micrometer + Actuator

專(zhuān)業(yè)監(jiān)控、對(duì)接Grafana

使用門(mén)檻高

生產(chǎn)環(huán)境實(shí)時(shí)監(jiān)控

Filter

全局請(qǐng)求層統(tǒng)計(jì)

粒度粗

網(wǎng)關(guān)、統(tǒng)一入口場(chǎng)景

事件監(jiān)聽(tīng)器

系統(tǒng)自動(dòng)監(jiān)聽(tīng)

不支持業(yè)務(wù)內(nèi)部耗時(shí)

簡(jiǎn)易接口請(qǐng)求分析

結(jié)語(yǔ):沒(méi)有監(jiān)控的優(yōu)化都是“空談”

在性能優(yōu)化的世界里,有一句老話:“你無(wú)法優(yōu)化你不了解的東西(You can't improve what you don't measure)”。無(wú)論是對(duì)接口響應(yīng)的監(jiān)控、還是對(duì)業(yè)務(wù)邏輯執(zhí)行效率的衡量,方法耗時(shí)統(tǒng)計(jì)都是系統(tǒng)調(diào)優(yōu)的重要基石。

通過(guò)本文介紹的七種耗時(shí)統(tǒng)計(jì)手段,開(kāi)發(fā)者可以:

  • 快速定位耗時(shí)點(diǎn),找出性能瓶頸;
  • 精細(xì)化地監(jiān)控關(guān)鍵業(yè)務(wù)邏輯;
  • 將系統(tǒng)運(yùn)行指標(biāo)納入可觀測(cè)體系,助力 DevOps;
  • 在不侵入原有業(yè)務(wù)邏輯的前提下,實(shí)現(xiàn)非侵入式性能分析;
  • 構(gòu)建符合生產(chǎn)要求的“性能感知型系統(tǒng)”。

每種方案都有其適用場(chǎng)景:手動(dòng)StopWatch適合快速驗(yàn)證,AOP適合中大型系統(tǒng)的統(tǒng)一統(tǒng)計(jì),自定義注解+AOP適合重點(diǎn)方法定點(diǎn)監(jiān)控,攔截器與Filter適合接口請(qǐng)求統(tǒng)計(jì),Micrometer/Actuator則是監(jiān)控系統(tǒng)集成首選,事件監(jiān)聽(tīng)提供了無(wú)需改動(dòng)代碼的全局方案。


責(zé)任編輯:武曉燕 來(lái)源: 路條編程
相關(guān)推薦

2024-10-08 09:06:01

Spring應(yīng)用程序配置

2011-12-16 14:45:36

JavaJSP

2011-05-30 13:37:46

JSP

2016-09-28 20:05:22

2022-05-24 14:37:49

React條件渲染

2024-05-23 12:40:06

2024-07-29 08:00:00

2023-04-18 15:57:30

2022-10-27 08:09:33

2022-09-30 10:48:12

AR制造業(yè)

2020-01-02 16:30:02

Spring BootJava異步請(qǐng)求

2021-09-18 16:10:48

Spring BootJava微服務(wù)

2024-06-19 10:53:45

2024-04-25 15:52:40

2021-07-02 10:43:52

IT人才首席信息官人才招聘

2016-12-27 19:19:51

2009-10-29 16:32:24

查看Oracle用戶的

2023-08-10 07:00:06

虛擬代理客戶人工智能

2025-04-28 03:00:00

2024-11-21 16:30:21

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)