欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot統(tǒng)計(jì)接口請(qǐng)求耗時(shí)的方法詳解

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

寫在前面

接口請(qǐng)求時(shí)間的快慢就代表著獲取到對(duì)應(yīng)的數(shù)據(jù)的快慢,也代表著用戶請(qǐng)求頁(yè)面數(shù)據(jù)的快慢,常常可以借助接口請(qǐng)求快慢進(jìn)行相應(yīng)的優(yōu)化!

以往我們的做法可能是在每一個(gè)接口的方法中的開(kāi)始添加當(dāng)前時(shí)間,結(jié)尾用當(dāng)前時(shí)間減去開(kāi)始時(shí)間就表示該接口的訪問(wèn)時(shí)間。

具體代碼如下:

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

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

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

解決方案

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

引入對(duì)應(yīng)依賴

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

自定義注解

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

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)計(jì) 方法/接口耗時(shí) 注解
 *
 * @author devcheng
 */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CostTime {

}

定義AOP切面

如果接口方法上應(yīng)用了自定義的注解,那么就會(huì)被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)計(jì) 方法/接口耗時(shí) 注解
 *
 * @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();
            //計(jì)算耗時(shí)
            long cost = System.currentTimeMillis() - beginTime;
            log.error("類:[{}],方法:[{}] 接口耗時(shí):[{}]", className,method, cost + "毫秒");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return obj;
    }

}

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

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

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

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

運(yùn)行輸出

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] 接口耗時(shí):[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] 接口耗時(shí):[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] 接口耗時(shí):[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] 接口耗時(shí):[1毫秒]

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

相關(guān)文章

  • 淺談StringEntity 和 UrlEncodedFormEntity之間的區(qū)別

    淺談StringEntity 和 UrlEncodedFormEntity之間的區(qū)別

    這篇文章主要介紹了StringEntity 和 UrlEncodedFormEntity之間的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問(wèn)題及解決

    MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java 動(dòng)態(tài)代理深入理解

    Java 動(dòng)態(tài)代理深入理解

    這篇文章主要介紹了Java 動(dòng)態(tài)代理深入理解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java基于Tcp的基礎(chǔ)聊天功能實(shí)例

    Java基于Tcp的基礎(chǔ)聊天功能實(shí)例

    這篇文章主要介紹了Java基于Tcp的基礎(chǔ)聊天功能,結(jié)合實(shí)例形式分析了java基于tcp協(xié)議的數(shù)據(jù)傳輸實(shí)現(xiàn)聊天功能相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • SpringBoot中間件封裝限流器的方案詳解

    SpringBoot中間件封裝限流器的方案詳解

    這篇文章主要介紹了SpringBoot中間件封裝限流器,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • maven中的scope與systemPath用法

    maven中的scope與systemPath用法

    這篇文章主要介紹了maven中的scope與systemPath用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • springboot中EasyPoi實(shí)現(xiàn)自動(dòng)新增序號(hào)的方法

    springboot中EasyPoi實(shí)現(xiàn)自動(dòng)新增序號(hào)的方法

    本文主要介紹了EasyPoi實(shí)現(xiàn)自動(dòng)新增序號(hào),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java中HashTable和HashMap的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中HashTable和HashMap的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    HashTable和HashMap主要的區(qū)別有:線程安全性,同步(synchronization),以及速度。接下來(lái)通過(guò)本文給大家簡(jiǎn)單介紹下HashTable和HashMap的區(qū)別,需要的的朋友參考下吧
    2017-04-04
  • SpringBoot中Tomcat和SpringMVC整合源碼分析

    SpringBoot中Tomcat和SpringMVC整合源碼分析

    Tomcat和SpringMVC都是通過(guò)這樣的方式進(jìn)行集成的,SpringBoot出現(xiàn)之前SpringMVC項(xiàng)目是直接部署在Tomcat服務(wù)器中的,這篇文章主要介紹了SpringBoot中Tomcat和SpringMVC整合源碼分析,需要的朋友可以參考下
    2022-07-07
  • Spring?Boot各類變量的使用小結(jié)

    Spring?Boot各類變量的使用小結(jié)

    這篇文章主要介紹了Spring?Boot各類變量的使用小結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01

最新評(píng)論