当前位置: 首页 > news >正文

项目经理最近感觉系统慢了,想知道整个系统每个方法的执行时间

听说微信搜索《Java鱼仔》会变更强哦!

本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦

(一)前言

最近到年底了,上线三个月的系统也已经稳定了。不过项目经理最近感觉系统变慢了,想知道整个系统前端和后端所有方法的执行时间。是的你没有听错,是每个方法。这个需求一提出来就被整蒙了,给每个方法计算执行时间,这不是平白给系统压力吗?

(二)思路

既然提了,先给思路吧。其实很简单,每个方法执行前记录一个时间戳,执行结束后记录一个时间戳,相减就是执行时间。但是去每个方法里改是不现实的,那么多代码,如果去侵入那工作量也太大了,而且如果有一天项目经理又不要这个功能了呢?

一听到这个需求,就应该想到AOP,用了那么久的Spring,IOC、AOP背的滚瓜烂熟,现在就是应用的时候了。

(三)使用AOP记录时间

AOP的概念就不在这里提了,面向切面,无侵入开发,正适合这个需求。而且20行代码可以解决问题。

3.1 引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

3.2 配置切面

首先配置一个切入点,我这里要让切面在TestController这个类中的所有方法上生效

@Slf4j
@Component
@Aspect
@Order(10)
public class LogAspect {

	//配置切入点,即执行的位置
    @Pointcut("execution(* com.javayz.codinguser.controller.TestController.*(..))")
    public void pointCut(){
    }

	//使用环绕通知,在方法的执行前后分别记录一个时间相减
    @Around("pointCut()")
    public Object doLog(ProceedingJoinPoint proceedingJoinPoint){
        long startTime = System.currentTimeMillis();
        Object object=null;
        try {
            object=proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }finally {
            long endTime = System.currentTimeMillis();
            log.info(proceedingJoinPoint.getSignature().toShortString()+"方法执行了:"+(endTime-startTime)+"ms");
        }
        return object;
    }
}

TestController方法是这样的:

@RestController
@RequestMapping("/testApi")
public class TestController {

    @GetMapping("/test1")
    public String testAop(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "testAop";
    }
}

3.3 测试一下

直接调用/testApi/test1,效果出来了

在这里插入图片描述

3.4 自定义一个注解

现在已经可以满足项目经理的需求了,如果以后新的代码没有在切入点的范围内,就又不生效了,因此定义一个注解吧,要记录时直接写个注解

@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
}

配置切入点的时候增加注解

@Pointcut("execution(* com.javayz.codinguser.controller.TestController.*(..)) || @annotation(com.javayz.codinguser.annotation.LogAnnotation)")
public void pointCut(){
}

好了,在需要执行的时候加上这个注解就OK了。

(四)关于记录数据的问题

项目经理还希望可以随时查某个时间的方法执行时间,那就必须存下来这些数据了。

现在这个系统共有4万人使用,如果存入数据库,我在表里定义三个字段:时间、调用人员、调用时间,调用方法,一条数据大约在40字节大小。按四万个人的使用,一天最少也要产生4000万条数据,大约1.5G。数据量倒是没关系,对数据库写入的压力就更大了。

如果存在日志里也一样,日志会变得特别大,而且排查起来不方便。

(五)结果

最终,在和项目经理一顿讲理之后,终于改变了他的想法,只记录执行时间超过200ms的方法,并且数据就记录下日志里,这个需求也算是通过沟通和小部分代码就解决了。好了,我们下期再见!

相关文章:

  • 获得指定文件夹所有文件的路径
  • 面试官问我:Zookeeper实现分布式锁的原理是什么?
  • typedef与#define的区别
  • 一步步教你如何在SpringBoot项目中引入支付功能
  • OSChina 周三乱弹 ——你是有多寂寞啊,看光头强都……
  • 今天不聊技术,谈谈我眼中的程序员到底是个怎样的职业
  • 关于JVM调优,我理了一些工具和思路出来
  • 2016年4月20日***学习总结
  • 关于ThreadLocal的九个知识点,看完别再说不懂了
  • Java程序员需要知道的操作系统知识汇总(持续更新)
  • Tkinter之输入框操作
  • 平稳运行半年的系统宕机了,记录一次排错调优的全过程!
  • 服务发现、配置中心,Nacos帮我们都搞定了
  • 我竟从一道算法题中看到了浪漫
  • GRUB启动命令详解
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • AHK 中 = 和 == 等比较运算符的用法
  • angular学习第一篇-----环境搭建
  • Git 使用集
  • leetcode386. Lexicographical Numbers
  • node入门
  • PHP那些事儿
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 对象管理器(defineProperty)学习笔记
  • 漂亮刷新控件-iOS
  • 优秀架构师必须掌握的架构思维
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • raise 与 raise ... from 的区别
  • ​flutter 代码混淆
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二)学习JVM —— 垃圾回收机制
  • (规划)24届春招和25届暑假实习路线准备规划
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (九)信息融合方式简介
  • (六)Hibernate的二级缓存
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四) Graphivz 颜色选择
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET : 在VS2008中计算代码度量值
  • .NET 设计一套高性能的弱事件机制
  • .NET6 命令行启动及发布单个Exe文件
  • .net中调用windows performance记录性能信息
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @Data注解的作用
  • @RequestBody与@ResponseBody的使用
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决