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

SpringBoot統(tǒng)計接口請求耗時的方法詳解

 更新時間:2024年12月26日 09:27:43   作者:伊成  
接口請求時間的快慢就代表著獲取到對應(yīng)的數(shù)據(jù)的快慢,也代表著用戶請求頁面數(shù)據(jù)的快慢,常??梢越柚涌谡埱罂炻M行相應(yīng)的優(yōu)化,本文給大家介紹了SpringBoot統(tǒng)計接口請求耗時的方法,需要的朋友可以參考下

寫在前面

接口請求時間的快慢就代表著獲取到對應(yīng)的數(shù)據(jù)的快慢,也代表著用戶請求頁面數(shù)據(jù)的快慢,常??梢越柚涌谡埱罂炻M行相應(yīng)的優(yōu)化!

以往我們的做法可能是在每一個接口的方法中的開始添加當前時間,結(jié)尾用當前時間減去開始時間就表示該接口的訪問時間。

具體代碼如下:

@RequestMapping("/test")
public String test(){
    long startTime = System.currentTimeMillis();
    //此處的調(diào)用業(yè)務(wù)代碼省略
    System.out.println("訪問時間為:"+(System.currentTimeMillis()-startTime));
    return "訪問接口成功";
}

那如果有幾百個接口的話,每一個接口都需要統(tǒng)計對應(yīng)的訪問時間的話,那就要寫幾百遍,這很不符合我們的常理,所以有沒有一種辦法是可以不修改對應(yīng)的接口方法,并且只需要寫一遍就能夠應(yīng)用到所有的接口上面或者指定的接口上面。

我們第一時間就可以想到AOP技術(shù),AOP是在Spring當中比較常見的技術(shù), AOP就是在不修改原來的代碼就可以對接口方法進行增強的作用,利用AOP可以對業(yè)務(wù)邏輯的各個部分進行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。

解決方案

根據(jù)上述,我們需要到AOP,第一個不能少的則是對應(yīng)的依賴。

引入對應(yīng)依賴

<!--aspectj-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
	<version>2.7.4</version>
</dependency>

自定義注解

統(tǒng)計接口的耗時和訪問次數(shù)也不需要每一個接口都使用,比如說一些不經(jīng)常訪問的接口就沒有統(tǒng)計他的訪問次數(shù),所以我們可以自定義一個注解,只要對應(yīng)的接口方法上應(yīng)用了這個注解,Spring會進行掃描,并執(zhí)行對應(yīng)的統(tǒng)計耗時操作即可。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 統(tǒng)計 方法/接口耗時 注解
 *
 * @author devcheng
 */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CostTime {

}

定義AOP切面

如果接口方法上應(yīng)用了自定義的注解,那么就會被Spring掃描到,這里我用的是 @Pointcut 和 @Around 配合使用。

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 統(tǒng)計 方法/接口耗時 注解
 *
 * @author devcheng
 */
@Aspect
@Component
@Slf4j
public class CostTimeAspect {

    @Pointcut(value = "@annotation(net.devcheng.www.data.annotation.CostTime)")
    public void costTime() {
    }

    @Around("costTime()")
    public Object costTimeAround(ProceedingJoinPoint joinPoint) {
        Object obj = null;
        try {
            long beginTime = System.currentTimeMillis();
            obj = joinPoint.proceed();
            //獲取方法名稱
            String method = joinPoint.getSignature().getName();
            //獲取類名稱
            String className=joinPoint.getSignature().getDeclaringTypeName();
            //計算耗時
            long cost = System.currentTimeMillis() - beginTime;
            log.error("類:[{}],方法:[{}] 接口耗時:[{}]", className,method, cost + "毫秒");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return obj;
    }

}

用在統(tǒng)計接口上

@GetMapping("/V4/getSignsPredictDetail")
@ResponseBody
@CostTime
public String getSignsPredictDetail(String name) {
    if (StringUtils.isEmpty(name)) {
        return "[]";
    }
    return cityBrain4Service.getSignsPredictDetailByName(name);
}

用在統(tǒng)計定時任務(wù)上

@Scheduled(cron = "55 */5 * * * ?")
@CostTime
public void scenesSignTask() {
    // 業(yè)務(wù)邏輯
}

運行輸出

2022-11-18 10:31:51.523 [http-nio-8886-exec-8] ERROR net.devcheng.www.data.config.CostTimeAspect Line:32  - 類:[net.devcheng.www.data.controller.SpecialInterfaceController],方法:[getWeather] 接口耗時:[0毫秒]
2022-11-18 10:31:52.122 [http-nio-8886-exec-9] ERROR net.devcheng.www.data.config.CostTimeAspect Line:32  - 類:[net.devcheng.www.data.controller.SpecialInterfaceController],方法:[getWeather] 接口耗時:[1毫秒]
2022-11-18 10:31:55.073 [http-nio-8886-exec-15] ERROR net.devcheng.www.data.config.CostTimeAspect Line:32  - 類:[net.devcheng.www.data.controller.CityBrain4Controller],方法:[getScrollingMessages] 接口耗時:[2毫秒]
2022-11-18 10:31:55.076 [http-nio-8886-exec-3] ERROR net.devcheng.www.data.config.CostTimeAspect Line:32  - 類:[net.devcheng.www.data.controller.SpecialInterfaceController],方法:[getWeather] 接口耗時:[1毫秒]

以上就是SpringBoot統(tǒng)計接口請求耗時的方法詳解的詳細內(nèi)容,更多關(guān)于SpringBoot接口請求耗時的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實現(xiàn)PNG圖片格式轉(zhuǎn)BMP圖片格式

    Java實現(xiàn)PNG圖片格式轉(zhuǎn)BMP圖片格式

    在實際開發(fā)中,有時需要在不同平臺、不同應(yīng)用場景中對圖片格式進行轉(zhuǎn)換,本文主要介紹了如何使用 Java 語言實現(xiàn)將 PNG 格式的圖片轉(zhuǎn)換為 BMP 格式的圖片,需要的可以了解下
    2025-03-03
  • java sql ResultSet 之getRow()用法說明

    java sql ResultSet 之getRow()用法說明

    這篇文章主要介紹了java sql ResultSet 之getRow()用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java Scanner類的使用示例

    Java Scanner類的使用示例

    這篇文章主要介紹了Java Scanner類的使用示例,幫助大家更好的理解和學習java,感興趣的朋友可以了解下
    2020-08-08
  • MyBatis持久層框架的用法知識小結(jié)

    MyBatis持久層框架的用法知識小結(jié)

    MyBatis 本是apache的一個開源項目iBatis,接下來通過本文給大家介紹MyBatis持久層框架的用法知識小結(jié),非常不錯,具有參考借鑒價值,感興趣的朋友一起學習吧
    2016-07-07
  • 如何利用泛型封裝通用的service層

    如何利用泛型封裝通用的service層

    這篇文章主要介紹了如何利用泛型封裝通用的service層,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java簡單實現(xiàn)兩個Word文檔的差異比對

    Java簡單實現(xiàn)兩個Word文檔的差異比對

    在文檔管理與版本控制場景中,比較兩個 Word 文檔之間的差異是一個常見需求,本文將介紹如何使用 Java 語言,借助 Spire.Doc for Java 庫,實現(xiàn)兩個 Word 文檔的內(nèi)容比較功能,希望對大家有所幫助
    2026-05-05
  • java導出Excel(非模板)可導出多個sheet方式

    java導出Excel(非模板)可導出多個sheet方式

    Java開發(fā)中,導出Excel是常見需求,有時需要支持多個Sheet導出,此技巧介紹非模板方式實現(xiàn)單標題單Sheet以及多Sheet導出,標題一致或不一致均可,可換成Map使用,適合個人開發(fā)者和需要Excel導出功能的場景
    2024-09-09
  • Springmvc ViewResolver設(shè)計實現(xiàn)過程解析

    Springmvc ViewResolver設(shè)計實現(xiàn)過程解析

    這篇文章主要介紹了Springmvc ViewResolver設(shè)計實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 詳細聊一聊Java中的包機制

    詳細聊一聊Java中的包機制

    這篇文章主要介紹了Java中包機制的相關(guān)資料,Java包機制通過定義、命名和組織類,防止命名沖突,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-05-05
  • SpringBoot實現(xiàn)微信小程序支付功能

    SpringBoot實現(xiàn)微信小程序支付功能

    小程序支付功能已成為眾多應(yīng)用的核心需求之一,本文主要介紹了SpringBoot實現(xiàn)微信小程序支付功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04

最新評論

高雄市| 蒙自县| 东兰县| 枣庄市| 峨山| 聂拉木县| 天柱县| 香港 | 侯马市| 紫金县| 广元市| 思南县| 江口县| 北海市| 新兴县| 石台县| 四子王旗| 新平| 台湾省| 汶川县| 瑞金市| 娄烦县| 班玛县| 扎囊县| 冷水江市| 延吉市| 绥化市| 屏东县| 定安县| 长乐市| 金秀| 灵山县| 饶阳县| 弥渡县| 永康市| 英超| 荆门市| 朝阳区| 凤台县| 曲松县| 集贤县|