SpringBoot统计接口请求耗时的方法详解

 更新时间:2024年12月26日 09:27:43   作者:伊成  
接口请求时间的快慢就代表着获取到对应的数据的快慢,也代表着用户请求页面数据的快慢,常常可以借助接口请求快慢进行相应的优化,本文给大家介绍了SpringBoot统计接口请求耗时的方法,需要的朋友可以参考下

写在前面

接口请求时间的快慢就代表着获取到对应的数据的快慢,也代表着用户请求页面数据的快慢,常常可以借助接口请求快慢进行相应的优化!

以往我们的做法可能是在每一个接口的方法中的开始添加当前时间,结尾用当前时间减去开始时间就表示该接口的访问时间。

具体代码如下:

@RequestMapping("/test")
public String test(){
    long startTime = System.currentTimeMillis();
    //此处的调用业务代码省略
    System.out.println("访问时间为:"+(System.currentTimeMillis()-startTime));
    return "访问接口成功";
}

那如果有几百个接口的话,每一个接口都需要统计对应的访问时间的话,那就要写几百遍,这很不符合我们的常理,所以有没有一种办法是可以不修改对应的接口方法,并且只需要写一遍就能够应用到所有的接口上面或者指定的接口上面。

我们第一时间就可以想到AOP技术,AOP是在Spring当中比较常见的技术, AOP就是在不修改原来的代码就可以对接口方法进行增强的作用,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

解决方案

根据上述,我们需要到AOP,第一个不能少的则是对应的依赖。

引入对应依赖

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

自定义注解

统计接口的耗时和访问次数也不需要每一个接口都使用,比如说一些不经常访问的接口就没有统计他的访问次数,所以我们可以自定义一个注解,只要对应的接口方法上应用了这个注解,Spring会进行扫描,并执行对应的统计耗时操作即可。

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;

/**
 * 统计 方法/接口耗时 注解
 *
 * @author devcheng
 */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CostTime {

}

定义AOP切面

如果接口方法上应用了自定义的注解,那么就会被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;

/**
 * 统计 方法/接口耗时 注解
 *
 * @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;
    }

}

用在统计接口上

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

用在统计定时任务上

@Scheduled(cron = "55 */5 * * * ?")
@CostTime
public void scenesSignTask() {
    // 业务逻辑
}

运行输出

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统计接口请求耗时的方法详解的详细内容,更多关于SpringBoot接口请求耗时的资料请关注脚本之家其它相关文章!

相关文章

  • 使用Java校验SQL语句的合法性五种解决方案

    使用Java校验SQL语句的合法性五种解决方案

    这篇文章主要介绍了如何用java校验SQL语句的合法性(提供五种解决方案),使用JDBC API和JSqlParser库、正则表达式、ANTLR解析器生成器或Apache Calcite库都可以实现校验SQL语句的合法性,需要的朋友可以参考下
    2023-04-04
  • Spring Validation中的用户注册、JWT令牌之用户登入功能

    Spring Validation中的用户注册、JWT令牌之用户登入功能

    本文介绍了使用SpringValidation进行用户注册验证和JWT进行用户登录的方法,在用户注册时,通过@Validated注解和@Pattern注解对用户名和密码进行格式校验,并使用Result对象返回验证结果,感兴趣的朋友一起看看吧
    2024-11-11
  • Java进阶教程之String类

    Java进阶教程之String类

    这篇文章主要介绍了Java进阶教程之String类,String类对象是不可变对象(immutable object),String类是唯一一个不需要new关键字来创建对象的类,需要的朋友可以参考下
    2014-09-09
  • 使用Java生成JWT令牌的示例代码

    使用Java生成JWT令牌的示例代码

    json-web-token简称java web令牌,也称作JWT,是一种可以实现跨域身份验证身份的方案,jwt不加密传输数据,但能够通过数据前面验证数据的未被篡改,本文给大家介绍了如何使用Java生成JWT令牌,需要的朋友可以参考下
    2024-04-04
  • java  LinkedList类详解及实例代码

    java LinkedList类详解及实例代码

    这篇文章主要介绍了java LinkedList类详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • 如何利用泛型封装通用的service层

    如何利用泛型封装通用的service层

    这篇文章主要介绍了如何利用泛型封装通用的service层,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 详解批处理框架之Spring Batch

    详解批处理框架之Spring Batch

    Spring Batch是一个轻量级的、完善的批处理框架,作为Spring体系中的一员,它拥有灵活、方便、生产可用的特点。在应对高效处理大量信息、定时处理大量数据等场景十分简便。结合调度框架能更大地发挥Spring Batch的作用
    2021-06-06
  • Java8 HashMap扩容算法实例解析

    Java8 HashMap扩容算法实例解析

    这篇文章主要介绍了Java8 HashMap扩容算法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java Swing组件setBounds()简单用法实例分析

    java Swing组件setBounds()简单用法实例分析

    这篇文章主要介绍了java Swing组件setBounds()简单用法,结合实例形式分析了Swing组件setBounds()方法的功能与简单使用方法,需要的朋友可以参考下
    2017-11-11
  • SpringBoot监控Tomcat活动线程数来判断是否完成请求处理方式

    SpringBoot监控Tomcat活动线程数来判断是否完成请求处理方式

    这篇文章主要介绍了SpringBoot监控Tomcat活动线程数来判断是否完成请求处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论