最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot優(yōu)雅統(tǒng)計(jì)接口耗時(shí)實(shí)戰(zhàn)中的四種高效方案

 更新時(shí)間:2026年01月22日 09:01:58   作者:沒什么技術(shù)  
這篇文章主要為大家詳細(xì)介紹了SpringBoot優(yōu)雅統(tǒng)計(jì)接口耗時(shí)實(shí)戰(zhàn)中的四種高效方案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、需求背景與方案選型

在電商系統(tǒng)壓力測(cè)試中,我們發(fā)現(xiàn)某些接口響應(yīng)時(shí)間超過2秒,但難以快速定位瓶頸。本文將通過四種方案實(shí)現(xiàn)接口耗時(shí)統(tǒng)計(jì):

方案優(yōu)點(diǎn)適用場(chǎng)景
Spring AOP非侵入式、靈活度高需要詳細(xì)方法級(jí)統(tǒng)計(jì)
Filter簡(jiǎn)單易用、全局覆蓋快速實(shí)現(xiàn)入口統(tǒng)計(jì)
Interceptor結(jié)合請(qǐng)求上下文需要獲取請(qǐng)求參數(shù)
Micrometer+Prometheus生產(chǎn)級(jí)監(jiān)控、可視化長(zhǎng)期性能監(jiān)控分析

二、AOP方案實(shí)現(xiàn)(推薦)

2.1 添加依賴

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

2.2 耗時(shí)統(tǒng)計(jì)切面

@Aspect
@Component
@Slf4j
public class ApiTimeAspect {
    
    // 定義切入點(diǎn):所有Controller的public方法
    @Pointcut("execution(public * com.example..controller.*.*(..))")
    public void apiPointcut() {}
    
    @Around("apiPointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result;
        try {
            result = joinPoint.proceed();
        } finally {
            long cost = System.currentTimeMillis() - startTime;
            recordCost(joinPoint, cost);
        }
        return result;
    }
    
    private void recordCost(ProceedingJoinPoint joinPoint, long cost) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String methodName = signature.getDeclaringTypeName() + "." + signature.getName();
        
        log.info("API耗時(shí)統(tǒng)計(jì) || 方法: {} || 耗時(shí): {}ms", methodName, cost);
        
        // 可擴(kuò)展存儲(chǔ)到數(shù)據(jù)庫(kù)
        // monitorService.saveApiCost(methodName, cost);
    }
}

2.3 自定義注解實(shí)現(xiàn)精準(zhǔn)統(tǒng)計(jì)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeMonitor {
    String value() default "";
}

// 在切面中修改切入點(diǎn)表達(dá)式
@Pointcut("@annotation(com.example.annotation.TimeMonitor)")
public void annotationPointcut() {}

// 使用示例
@RestController
public class OrderController {
    
    @TimeMonitor("創(chuàng)建訂單接口")
    @PostMapping("/orders")
    public Order createOrder() {
        // 業(yè)務(wù)邏輯
    }
}

三、Filter方案實(shí)現(xiàn)(快速接入)

3.1 實(shí)現(xiàn)Filter

@WebFilter(urlPatterns = "/*")
@Slf4j
public class TimeCostFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                       FilterChain chain) throws IOException, ServletException {
        long start = System.currentTimeMillis();
        try {
            chain.doFilter(request, response);
        } finally {
            HttpServletRequest req = (HttpServletRequest) request;
            String uri = req.getRequestURI();
            long cost = System.currentTimeMillis() - start;
            
            log.info("請(qǐng)求路徑: {} || 耗時(shí): {}ms", uri, cost);
        }
    }
}

3.2 啟用Filter掃描

@SpringBootApplication
@ServletComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

四、Interceptor方案實(shí)現(xiàn)(結(jié)合請(qǐng)求參數(shù))

4.1 實(shí)現(xiàn)Interceptor

@Component
@Slf4j
public class TimeInterceptor implements HandlerInterceptor {
    
    private static final ThreadLocal<Long> TIME_HOLDER = new ThreadLocal<>();
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
                            HttpServletResponse response, 
                            Object handler) {
        TIME_HOLDER.set(System.currentTimeMillis());
        return true;
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request,
                               HttpServletResponse response,
                               Object handler, Exception ex) {
        long start = TIME_HOLDER.get();
        long cost = System.currentTimeMillis() - start;
        TIME_HOLDER.remove();
        
        String params = getRequestParams(request);
        log.info("請(qǐng)求路徑: {}?{} || 耗時(shí): {}ms", 
                request.getRequestURI(), params, cost);
    }
    
    private String getRequestParams(HttpServletRequest request) {
        return request.getParameterMap().entrySet().stream()
            .map(entry -> entry.getKey() + "=" + Arrays.toString(entry.getValue()))
            .collect(Collectors.joining("&"));
    }
}

4.2 注冊(cè)Interceptor

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Autowired
    private TimeInterceptor timeInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(timeInterceptor)
            .addPathPatterns("/api/**");
    }
}

五、生產(chǎn)級(jí)監(jiān)控方案(Prometheus集成)

5.1 添加依賴

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

5.2 配置監(jiān)控指標(biāo)

@Configuration
public class MetricsConfig {
    
    @Bean
    public TimedAspect timedAspect(MeterRegistry registry) {
        return new TimedAspect(registry);
    }
}

// 在Controller方法上添加注解
@RestController
public class ProductController {
    
    @Timed(value = "product.detail.time", description = "商品詳情接口耗時(shí)")
    @GetMapping("/products/{id}")
    public Product getDetail(@PathVariable Long id) {
        // 業(yè)務(wù)邏輯
    }
}

5.3 Prometheus配置示例

scrape_configs:
  - job_name: 'spring_app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8080']

六、性能優(yōu)化建議

異步日志寫入:避免日志輸出阻塞請(qǐng)求線程

@Async
public void saveCostLog(String method, long cost) {
    // 異步存儲(chǔ)到數(shù)據(jù)庫(kù)
}

采樣率控制:高并發(fā)場(chǎng)景下按比例采樣

if (random.nextDouble() < 0.1) { // 10%采樣率
    recordCost(joinPoint, cost);
}

異常處理:確保統(tǒng)計(jì)邏輯不破壞主流程

try {
    recordCost(...);
} catch (Exception e) {
    log.error("耗時(shí)統(tǒng)計(jì)異常", e);
}

七、方案對(duì)比與選型建議

維度AOP方案Filter方案Interceptor方案Prometheus方案
實(shí)現(xiàn)復(fù)雜度
數(shù)據(jù)粒度方法級(jí)請(qǐng)求級(jí)請(qǐng)求級(jí)方法級(jí)
性能影響低(納秒級(jí))
擴(kuò)展性
生產(chǎn)可維護(hù)性極高

選型建議

  • 快速驗(yàn)證:Filter方案
  • 精準(zhǔn)統(tǒng)計(jì):AOP+自定義注解
  • 生產(chǎn)監(jiān)控:Prometheus+Micrometer

到此這篇關(guān)于SpringBoot優(yōu)雅統(tǒng)計(jì)接口耗時(shí)實(shí)戰(zhàn)中的四種高效方案的文章就介紹到這了,更多相關(guān)SpringBoot統(tǒng)計(jì)接口耗時(shí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)遞歸計(jì)算n的階乘

    Java實(shí)現(xiàn)遞歸計(jì)算n的階乘

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)遞歸計(jì)算n的階乘,利用遞歸的思想實(shí)現(xiàn)階乘的計(jì)算,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java并發(fā)之嵌套管程鎖死詳解

    Java并發(fā)之嵌套管程鎖死詳解

    這篇文章主要介紹了Java并發(fā)之嵌套管程鎖死詳解,涉及嵌套管程鎖死的發(fā)生,實(shí)例等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java編程—在測(cè)試中考慮多態(tài)

    Java編程—在測(cè)試中考慮多態(tài)

    這篇文章主要介紹了Java編程—在測(cè)試中考慮多態(tài),具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • springboot使用消息中間件

    springboot使用消息中間件

    這篇文章主要介紹了springboot使用消息中間件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • SpringBoot框架中Mybatis-plus的簡(jiǎn)單使用操作匯總

    SpringBoot框架中Mybatis-plus的簡(jiǎn)單使用操作匯總

    這篇文章主要介紹了SpringBoot框架中Mybatis-plus的簡(jiǎn)單使用,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • hibernate中HQL如何調(diào)用自定義函數(shù)

    hibernate中HQL如何調(diào)用自定義函數(shù)

    這篇文章主要介紹了hibernate中HQL如何調(diào)用自定義函數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java字符串相關(guān)類使用方法詳解

    Java字符串相關(guān)類使用方法詳解

    String、StringBuilder、StringBuffer還傻傻分不清,下面這篇文章主要給大家介紹了關(guān)于Java字符串相關(guān)類使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • spring mvc路徑匹配原則詳解

    spring mvc路徑匹配原則詳解

    這篇文章主要介紹了spring mvc路徑匹配原則詳解,小編覺得還是挺不錯(cuò)的,這里分享給大家,需要的朋友可以參考下,下面就和小編一起來看看吧
    2018-02-02
  • Spring?Boot通過tomcat部署項(xiàng)目(包含jar包、war包)的完整過程

    Spring?Boot通過tomcat部署項(xiàng)目(包含jar包、war包)的完整過程

    SpringBoot是一個(gè)非常流行的Java框架,它簡(jiǎn)化了基于Spring的應(yīng)用程序的創(chuàng)建和部署過程,這篇文章主要介紹了Spring?Boot通過tomcat部署項(xiàng)目(包含jar包、war包)的完整過程,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • springMVC向Controller傳值出現(xiàn)中文亂碼的解決方案

    springMVC向Controller傳值出現(xiàn)中文亂碼的解決方案

    這篇文章主要介紹了springMVC向Controller傳值出現(xiàn)中文亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評(píng)論

洛阳市| 都江堰市| 阳谷县| 凭祥市| 盐源县| 海南省| 兴义市| 武穴市| 三明市| 曲沃县| 咸阳市| 那坡县| 闵行区| 武邑县| 新宾| 道真| 获嘉县| 繁峙县| 洞口县| 育儿| 自治县| 綦江县| 衡东县| 长白| 阳春市| 读书| 五常市| 荔浦县| 新竹县| 沙河市| 安庆市| 阳朔县| 富民县| 忻州市| 宝丰县| 海丰县| 姚安县| 北川| 古交市| 鞍山市| 磐安县|