震惊!Spring Boot 3 中请求执行时间的秘密全被揭开

360影视 动漫周边 2025-05-29 23:57 3

摘要:作为互联网大厂的后端开发人员,大家深知在 Spring Boot 3 的项目开发里,精准掌握每个请求从进入到响应出去的整个系统内部执行时间,对系统性能优化和问题排查有多重要。今天,就来给大家详细讲讲如何实现这一关键操作。

作为互联网大厂的后端开发人员,大家深知在 Spring Boot 3 的项目开发里,精准掌握每个请求从进入到响应出去的整个系统内部执行时间,对系统性能优化和问题排查有多重要。今天,就来给大家详细讲讲如何实现这一关键操作。

在如今高并发、大数据量的互联网业务场景下,哪怕是一毫秒的延迟,都可能在大量请求的堆积下,给用户体验和业务运转带来严重影响。以电商平台为例,在促销活动时,瞬间涌入的海量订单请求,如果系统不能快速响应,用户就会面临页面加载缓慢甚至卡顿崩溃的情况,这不仅会导致用户流失,还可能给商家带来巨大的经济损失。所以,监控请求执行时间,及时发现并解决性能瓶颈,成为了保障系统稳定高效运行的关键一环。

基于 ServletRequestHandledEvent

ServletRequestHandledEvent 是 Spring 框架中的一个事件类,当 Servlet 请求被处理完成后,它就会被触发。利用这个特性,我们可以轻松获取请求的处理耗时信息。

创建项目并引入依赖:打开我们熟悉的 IDE,比如 IntelliJ IDEA 或者 Eclipse,新建一个 Spring Boot 项目。在创建过程中,一定要记得勾选 “Spring Web” 起步依赖,这样我们的项目才能具备基本的 Web 开发能力。

自定义事件监听器:创建一个类,就叫 ApiTimeTrackingListener 吧,让它实现 ApplicationListener接口。在这个类中,我们这样获取请求时间信息:

@Overridepublic void onApplicationEvent(ServletRequestHandledEvent event) {long startTime = event.getStartTime;long endTime = System.currentTimeMillis;long timeConsumed = endTime - startTime;String url = event.getRequestUrl;System.out.println("接口 " + url + " 耗时:" + timeConsumed + " 毫秒");}

通过 event.getStartTime ,我们能拿到请求开始时间,再用 System.currentTimeMillis 获取当前系统时间作为结束时间,两者一减,接口耗时就出来啦。同时,把请求的 URL 也获取到,方便我们后续定位具体是哪个接口的耗时情况。

注册事件监听器:要让我们写的监听器生效,得把它注册到 Spring 容器中。我们既可以在主启动类上添加 @ComponentScan 注解,保证监听器所在的包能被扫描到;也可以在配置类中用 @Bean 方法来注册,像这样:

@Beanpublic ApiTimeTrackingListener apiTimeTrackingListener {return new ApiTimeTrackingListener;}

这样,一个简单的基于 ServletRequestHandledEvent 的 Spring Boot 3 接口耗时记录功能就完成了。项目启动后,每次有接口被调用,控制台就会打印出该接口的耗时信息。要是结合日志框架,还能把这些耗时信息以更规范的日志形式输出,排查问题就更方便了。

AOP 是一种强大的编程思想,它可以在不修改原有业务代码的基础上,通过切面来统一添加额外功能。我们可以利用 AOP 来拦截请求,记录请求的开始和结束时间,从而计算出执行时间。

org.springframework.bootspring-boot-starter-aop

创建切面类:创建一个 Aspect 类,例如 RequestTimeAspect,在这个类中定义切点和增强逻辑。

@Aspect@Componentpublic class RequestTimeAspect {private static final Logger logger = LoggerFactory.getLogger(RequestTimeAspect.class);@Around("execution(public * com.example.controller.*.*(..))")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {long startTime = System.currentTimeMillis;Object proceed = joinPoint.proceed;long endTime = System.currentTimeMillis;long timeConsumed = endTime - startTime;String methodName = joinPoint.getSignature.getName;logger.info("方法 {} 执行耗时:{} 毫秒", methodName, timeConsumed);return proceed;}}

这里,我们通过 @Around 注解定义了一个环绕增强,切点表达式 “execution (public * com.example.controller..(..))” 表示拦截 com.example.controller 包下所有控制器类的所有公共方法。在增强逻辑中,先记录请求开始时间,执行目标方法,再记录结束时间,计算出耗时并记录到日志中。

某互联网大厂的在线教育平台,在使用 Spring Boot 3 搭建后端服务时,通过上述方法监控请求执行时间。发现课程详情页接口的平均响应时间较长,经过排查,原来是在查询课程相关数据时,数据库查询语句没有进行优化,关联查询过多导致查询效率低下。通过对查询语句进行优化,添加合适的索引,课程详情页接口的响应时间大幅缩短,用户在浏览课程详情时更加流畅,平台的用户满意度和活跃度都得到了显著提升。

通过以上两种方法,我们可以有效地获取 Spring Boot 3 中请求的执行时间,为系统性能优化提供有力的数据支持。各位后端开发的小伙伴们,赶紧在自己的项目中实践起来吧!如果你在实践过程中有任何问题或者新的发现,欢迎在评论区留言分享,让我们一起共同进步,打造更高效、更稳定的互联网后端系统!

来源:从程序员到架构师一点号

相关推荐