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接口请求耗时的资料请关注脚本之家其它相关文章!

相关文章

  • Spring自定义注解的实现与使用方式

    Spring自定义注解的实现与使用方式

    注解是Java中用于类、方法、参数、包的装饰标志,本身不具备功能,但可定义参数,Java包含内建注解和元注解,如@Target、@Retention等,描述注解的使用范围和生命周期,Spring的AOP(面向切面编程)可以结合注解实现功能,如权限控制和日志记录
    2024-09-09
  • java操作excel的方法

    java操作excel的方法

    这篇文章主要介绍了java操作excel的方法,实例分析了java针对excel文件的读写、打开、保存等操作技巧,需要的朋友可以参考下
    2015-07-07
  • 多个sheet Excel 数据导入数据库的实现方法

    多个sheet Excel 数据导入数据库的实现方法

    这篇文章主要介绍了多个sheet Excel 数据导入数据库的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • swagger的请求参数不显示,@Apimodel的坑点及解决

    swagger的请求参数不显示,@Apimodel的坑点及解决

    这篇文章主要介绍了swagger的请求参数不显示,@Apimodel的坑点及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Spring MVC参数校验详解(关于`@RequestBody`返回`400`)

    Spring MVC参数校验详解(关于`@RequestBody`返回`400`)

    这篇文章主要介绍了Spring MVC参数校验的相关资料,主要是针对`@RequestBody`返回`400`的问题,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • 二叉排序树的实现与基本操作

    二叉排序树的实现与基本操作

    二叉排序树又称二叉查找树。本文主要对二叉排序树的实现与基本操作进行详细介绍,以下代码实现了:1、二叉树的构建;2、二叉树的中、前、后、层序遍历;3、二叉树中结点的最大距离。下面就跟着小编一起来看下吧
    2016-12-12
  • Resttemplate上传文件500异常的原因及解决方法

    Resttemplate上传文件500异常的原因及解决方法

    使用 Resttemplate 调用 DMS 文件服务器 Http 接口,出现 500 异常报错,所以本文给大家介绍了Resttemplate上传文件500异常的原因及解决方法,需要的朋友可以参考下
    2024-08-08
  • java 实现单链表逆转详解及实例代码

    java 实现单链表逆转详解及实例代码

    这篇文章主要介绍了java 实现单链表逆转实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java虚拟机堆内存溢出的原因和解决方法

    Java虚拟机堆内存溢出的原因和解决方法

    在Java开发中,内存溢出(OutOfMemoryError)是一个常见的问题,尤其是在处理大量数据或长时间运行的应用时,本文将通过一个简单的示例,展示如何通过JVM参数和代码分析来理解和解决内存溢出问题,需要的朋友可以参考下
    2024-10-10
  • SpringBoot整合MyCat实现读写分离的方法

    SpringBoot整合MyCat实现读写分离的方法

    这篇文章主要介绍了SpringBoot整合MyCat实现读写分离的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04

最新评论