优化controller中接口耗时统计

433 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

上一篇我们讲解了注解,这一片我们来看一个具体的注解的使用例子

我们在平常的开发过程中,经常会遇到去统计一个接口耗时,我们通常的做法就是在接口开始获取系统当前时间,接口结尾获取一下时间,两个时间做减法得到的数值来统计我们接口的耗时。

也不能说这种方法不行,只能说这种方法很low。而且很丑,代码很臃肿。

接下来我们来完成一个简单快捷,而且相对来说比较优雅的方式!

首先定义一个注解,是用来统计接口时长的!

/**
 * 统计一个方法耗时注解
 */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeConsuming{
}

这个注解便是作用在接口上,用来作为接口耗时统计的标识

接下来具体统计耗时的逻辑放到切面中,使用切面完成实际的的统计工作。

/**
 * 计算耗时注解的实际计算过程方法
 */
@Aspect
@Component
public class TimeConsumingAspect {
    private Logger logger = LoggerFactory.getLogger(TimeConsumingAspect.class);
    @Pointcut(value = "@annotation(com.yuxuntoo.www.common.annotations.TimeConsuming)")
    public void costTime(){ }

    @Around("runTime()")
    public Object costTimeAround(ProceedingJoinPoint joinPoint) {
        Object obj = null;
        try {
            long beginTime = System.currentTimeMillis();
            obj = joinPoint.proceed();
            //获取方法名称
            String method = joinPoint.getSignature().getName();
            //获取类名称
            String clazz = joinPoint.getSignature().getDeclaringTypeName();
            //计算耗时
            long cost = System.currentTimeMillis() - beginTime;
            logger.info("类:[{}],方法:[{}] 接口耗时:[{}]", clazz, method, cost + "毫秒");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return obj;
    }
}

上面这个类中的方法中计算了耗时,统计了类名、方法名。最后输出了具体方法的执行过程中的耗时多少!

怎么使用呢?

我们只需要在我们需要统计的耗时的controller的方法上面使用我们自己定义的注解TimeConsuming即可得到我们想要的接口耗时时间!

使用方法如下所示,

@TimeConsuming
@PostMapping("set_key")
public ApiResult setKey(@NotNull(message = "key不能为空") String key, int seconds, Object o){
    ApiResult apiResult = new ApiResult();
    boolean setResult = redisService.set(key, seconds, o);
    apiResult.setData(setResult);
    return apiResult;
}

喜欢,请关注公众号《coder练习生》