Spring Boot - 通过ServletRequestHandledEvent事件实现接口请求的性能监控
文章目录
- 概述
- 1. `ServletRequestHandledEvent`事件
- 2. 实现步骤
- 3. 优缺点分析
- 4. 测试与验证
- 小结
- 其他方案
- 1. 自定义拦截器
- 2. 性能监控平台
- 3. 使用Spring Boot Actuator
- 4. APM工具
概述
在Spring框架中,监控接口请求的性能可以通过ServletRequestHandledEvent事件实现。这种方法简单有效,能够帮助开发者实时跟踪和分析请求的性能。
1. ServletRequestHandledEvent事件
ServletRequestHandledEvent是Spring中的一个事件类,它在请求处理完成后发布,包含了请求的详细信息,如客户端地址、请求URL、请求方法和处理时间。使用这个事件可以轻松地监控和记录每个请求的性能数据。
2. 实现步骤
下面是如何通过TimeCountListener实现接口请求性能监控的步骤:
-
创建监听器类
实现
ApplicationListener<ServletRequestHandledEvent>接口并覆盖onApplicationEvent方法:@Component public class TimeCountListener implements ApplicationListener<ServletRequestHandledEvent> {@Overridepublic void onApplicationEvent(ServletRequestHandledEvent event) {Throwable failureCause = event.getFailureCause();if (failureCause != null) {System.err.printf("错误原因: %s%n", failureCause.getMessage());}System.err.println("========================================");System.err.printf("请求客户端地址:%s\n请求URL: %s\n请求Method: %s\n请求耗时: %d毫秒%n", event.getClientAddress(),event.getRequestUrl(), event.getMethod(), event.getProcessingTimeMillis());System.err.println("========================================");} } -
注册监听器
使用
@Component注解标记TimeCountListener,Spring会自动将其注册为应用程序的事件监听器。
3. 优缺点分析
优点:
- 简单易用:无需对业务代码进行侵入式修改,只需创建监听器类。
- 准确性高:Spring会在请求处理完成后发布事件,记录的时间较为准确。
- 低侵入性:与业务逻辑代码解耦,易于维护和扩展。
缺点:
- 性能开销:尽管开销较小,但记录和处理事件仍然会增加系统的负担。
- 事件丢失:在高并发或系统异常情况下,事件可能会丢失或记录不全。
4. 测试与验证

要测试TimeCountListener的有效性,可以创建一个测试接口,并在其上执行不同的请求。以下是一个简单的测试示例:
package com.artisan.controller;import com.artisan.domain.Artisan;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Arrays;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/1/9 22:39* @mark: show me the code , change the world*/@RestController
public class ArtisanController {@RequestMapping("/hi")public String test() {return "小工匠 每日一博";}@RequestMapping("/hi2")public Object test2() {Artisan artisan = new Artisan();artisan.setName("小工匠");artisan.setAge(18);artisan.setHobbies(Arrays.asList("code", "sleep", "study"));return artisan;}/*** 处理GET请求,返回自定义的响应* 该方法通过@RequestParam接收id和kw作为查询参数,然后构建一个自定义的响应返回给调用者* 主要用于演示如何在Spring MVC中返回自定义的响应体和响应头** @param id 需要查询的ID* @return 自定义的响应对象,包含响应体、响应头和HTTP状态码*/@GetMapping("/hi3")public Object index(Long id) {// 创建HttpHeaders对象,用于自定义响应头HttpHeaders headers = new HttpHeaders();// 向响应头中添加自定义的版本信息headers.add("x-version", "v1");// 创建响应对象,设置响应体、响应头和HTTP状态码ResponseEntity<Object> response = new ResponseEntity<>(// 构建响应体内容,格式化输出id和kwString.format("id = %d", id),headers,HttpStatus.valueOf(200));// 返回自定义的响应对象return response;}}
访问 http://localhost:7777/hi3?id=1

小结
使用Spring的ServletRequestHandledEvent进行接口请求性能监控是一种简单且有效的方法。通过创建一个监听器,可以轻松地获取请求的详细性能信息,而无需对现有代码进行重大修改。然而,这种方法也有其局限性,如轻微的性能开销和潜在的事件丢失问题。
其他方案
1. 自定义拦截器
概述:自定义拦截器可以用来在请求处理的不同阶段(如请求前、请求后、请求完成后)添加额外的逻辑。
实现步骤:
- 实现
HandlerInterceptor接口,覆盖其中的方法,如preHandle、postHandle、和afterCompletion。 - 在这些方法中记录请求开始时间、结束时间,计算处理时间。
- 将拦截器注册到Spring MVC配置中。
示例代码:
public class PerformanceInterceptor implements HandlerInterceptor {private static final Logger logger = LoggerFactory.getLogger(PerformanceInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {request.setAttribute("startTime", System.currentTimeMillis());return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {long startTime = (Long) request.getAttribute("startTime");long endTime = System.currentTimeMillis();long executeTime = endTime - startTime;logger.info("请求URL: {},耗时: {} ms", request.getRequestURI(), executeTime);}
}
优点:能够灵活控制每个请求的处理过程,精确测量请求耗时。
2. 性能监控平台
概述:使用专用的性能监控平台可以提供丰富的可视化和分析功能,帮助识别性能瓶颈。
常用工具:
- Prometheus和Grafana:Prometheus用于数据收集和监控,Grafana用于数据可视化和告警设置。
- New Relic:提供全面的应用性能监控,支持多种编程语言和框架。
- AppDynamics:实时监控应用性能,帮助快速定位问题。
集成步骤:
- 在应用中集成相应的监控客户端库。
- 配置监控指标和数据收集策略。
- 在监控平台上设置仪表板,实时观察应用性能数据。
优点:提供全面的性能数据分析和可视化,支持告警和历史数据回溯。
3. 使用Spring Boot Actuator
概述:Spring Boot Actuator提供了一组生产级的监控功能,包括指标、健康检查、审计等。
集成步骤:
- 在Spring Boot项目中引入
spring-boot-starter-actuator依赖。 - 配置
application.properties启用所需的监控端点。 - 使用内置的HTTP端点或JMX监控应用的健康状况和性能指标。
示例配置:
management.endpoints.web.exposure.include=*
优点:集成简单,提供丰富的监控端点,适合Spring Boot应用。
4. APM工具
概述:应用性能管理(APM)工具可以帮助全面监控和分析应用性能,识别瓶颈并优化性能。
常用工具:
- Elastic APM:与Elastic Stack整合,提供应用性能监控和日志管理。
- Datadog:支持云原生应用监控,提供全面的性能数据。
- Skywalking:支持云原生应用监控,提供全面的性能数据。
优点:提供详细的性能分析报告和可视化,易于识别和解决性能问题。

相关文章:
Spring Boot - 通过ServletRequestHandledEvent事件实现接口请求的性能监控
文章目录 概述1. ServletRequestHandledEvent事件2. 实现步骤3. 优缺点分析4. 测试与验证小结其他方案1. 自定义拦截器2. 性能监控平台3. 使用Spring Boot Actuator4. APM工具 概述 在Spring框架中,监控接口请求的性能可以通过ServletRequestHandledEvent事件实现。…...
Docker相关配置记录
Docker相关配置记录 换源 {"registry-mirrors": ["https://dockerhub.icu","https://docker.chenby.cn","https://docker.1panel.live","https://docker.awsl9527.cn","https://docker.anyhub.us.kg","htt…...
MySQL中INT(3)与INT(11)
本文由 ChatMoney团队出品 开篇 在MySQL数据库设计的世界里,数据类型的选择是一项基础而又至关重要的任务。其中,INT数据类型因其广泛的应用和灵活性备受青睐。然而,围绕着INT(3)与INT(11)的具体差异,常常存在一些误解。本文旨在…...
Qt 窗口:菜单、工具与状态栏的应用
目录 引言: 1. 菜单栏 1.1 创建菜单栏 1.2 在菜单栏中添加菜单 1.3 创建菜单项 1.4 在菜单项之间添加分割线 1.5 综合示例 2.工具栏 2.1 创建工具栏 2.2 设置停靠位置 2.3 设置浮动属性 2.4 设置移动属性 3. 状态栏 3.1 状态栏的创建 3.2 在状态栏中显…...
学习必备好物有哪些?高三开学季好物推荐合集
新学期即将开启,学习必备好物有哪些?以下是特别为高三学生朋友们精心挑选的一系列好物推荐,旨在帮助大家在更快更好的选择,快来看看都有哪些吧! 1、书客护眼大路灯Sun 书客是海内外知名的生物光学技术方案商…...
java的分类
目录 Java SE Java EE Java ME java主要分为三类,分别是Java SE,Java EE,Java ME。其中SE是EE和ME的基础。 Java SE 全名为Java Standard Edition,是 Java 平台的基础版本,为开发人员提供了构建和运行桌面应用程…...
基于火山引擎云搜索服务和豆包模型搭建 RAG 推理任务
大语言模型(LLM,Large language model)作为新一轮科技产业革命的战略性技术,其核心能力在于深层语境解析与知识融合。在生成式人工智能方向主要用于图像生成,书写文稿,信息搜索等。当下的 LLM 模型是基于大…...
Python 实现 Excel 文件操作的技术性详解
目录 一、引言 二、Excel 文件格式及库的选择 2.1 Excel 文件格式 2.2 库的选择 三、安装必要的库 四、使用 openpyxl 读取 Excel 文件 4.1 基本步骤 4.2 实战案例 五、使用 pandas 读取 Excel 文件 5.1 基本步骤 5.2 实战案例 六、写入 Excel 文件 6.1 使用 …...
Spring WebFlux 实现 SSE 流式回复:类GPT逐字显示回复效果完整指南
本节将提供基于 Spring WebFlux 和 SSE 实现类ChatGPT流式回复效果的完整代码示例,并详细说明所需的依赖和配置。 1. 项目配置 构建工具: Maven 或 Gradle依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>sp…...
成功解决7版本的数据库导入 8版本数据库脚本报错问题
我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 🎓擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号:热爱技术的小郑。回复 Java全套视频教程 或 前端全套视频…...
如何让RStudio使用不同版本的R
下面内容摘录自: 专栏问答:管理和选择不同的R,如何做好R的笔记_rstudio如何在不同的r版本中进行切换-CSDN博客 欢迎订阅我们专栏 问题一:如何发现RStudio需要安装和使用不同版本的R。这是为什么呢? R允许用户在同一系统…...
汽车免拆诊断案例 | 2011 款进口现代新胜达车智能钥匙系统有时失效
故障现象 一辆2011款进口现代新胜达车,搭载G4KE发动机,累计行驶里程约为26.3万km。车主进厂反映,有时进入车内按下起动按钮,发动机无法起动,且组合仪表黑屏。 故障诊断 接车后试车,车辆使用一切正常。…...
Count clock
写了半天不对,才注意到是十六进制的 - - 另外安装了vivado 哈哈哈哈,可以看看写的到底对不对 之前好多程序在 hdlbits 可以正确运行 但是 vivado 编译不通过。 module clock(input clk,input reset,input ena,output reg pm,output reg[7:0] hh,output …...
【MySQL】1.MySQL基本操作
目录 一、MySQL数据库登陆 1、设置环境变量 2、cmd命令登陆数据库 二、基本操作语法 1、显示数据库——SHOW 2、使用/选择数据库——USE 3、删除——DROP 4、创建——CREATE 5、查看表结构——DESC 6、数据操作——增删改查 (1)增/插入&#…...
Qt .qm文件详解
Qt中的.qm文件是Qt翻译文件的一种,主要用于支持软件的多语言转换。在生成Qt应用程序时,qm文件会被包含进应用程序中,根据逻辑以显示对应语言的界面。 .qm文件的基本信息 格式:.qm文件是Qt应用程序中用于存储翻译文本的二进制文件…...
【计算机网络】UDP实战
其实经过这几天写的几种不同的UDP的简易客户端与服务端,还是很有套路的,起手式都是非常像的。 更多的难点对我来说反而是解耦,各种各样的function一用,回调函数一调,呕吼,就会懵一下。 对于这篇文章&#x…...
七、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制和JS颜色选择器改变灯珠颜色
本地代码集成离线iro.js库来添加一个颜色选择器控件,在无网络环境可以通过JavaScript将选中的颜色发送到服务器以改变LED颜色。以下是将iro.js集成到网页后的颜色图片。 Iro.js 地址API操作手册 color:change # 每当所选颜色发生变化时触发 - 无论是当用户与颜色选…...
Z 字形遍历二叉树
假设一个二叉树上各结点的权值互不相同。 我们就可以通过其后序遍历和中序遍历来确定唯一二叉树。 请你输出该二叉树的 ZZ 字形遍历序列----也就是说,从根结点开始,逐层遍历,第一层从右到左遍历,第二层从左到右遍历,…...
[Vue]Vue3从入门到精通-综合案例分析
一.Vue是什么: 概念:Vue是一个用于构建用户界面的渐进式的框架 以下的内容是自里向外的 声明式渲染(Vuejs核心包)组件系统(Vuejs核心包)客户端路由VueRouter大规模状态管理Vuex构建工具Webpack/Vite Vue的两种使用方式: Vue核心包开发-&…...
深度学习——神经网络(neural network)详解(二). 带手算步骤,步骤清晰0基础可看
深度学习——神经网络(neural network)详解(二). 手算步骤,步骤清晰0基础可看 前文如下:深度学习——神经网络(neural network)详解(一). 带手算步骤&#x…...
KMS_VL_ALL_AIO终极指南:5分钟搞定Windows与Office永久激活的简单教程
KMS_VL_ALL_AIO终极指南:5分钟搞定Windows与Office永久激活的简单教程 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经为Windows系统弹出"需要激活"的提示而烦恼…...
SEO_中小企业必备的快速见效SEO优化解决办法
SEO: 中小企业必备的快速见效SEO优化解决办法 在当前竞争激烈的市场环境中,中小企业如何迅速提升在搜索引擎上的曝光率,成为每个企业家关注的焦点。搜索引擎优化(SEO)不仅能帮助企业吸引更多潜在客户,还能显著提高网站…...
Janus-Pro-7B人力资源:简历截图信息抽取+岗位匹配度分析报告
Janus-Pro-7B人力资源:简历截图信息抽取岗位匹配度分析报告 1. 引言:智能招聘的新助手 招聘工作最头疼的是什么?每天收到上百份简历,一份份看下来眼睛都花了。更麻烦的是,还要手动从简历里提取关键信息,再…...
GPU显存友好!Ostrakon-VL-8B Bfloat16加速部署详解
GPU显存友好!Ostrakon-VL-8B Bfloat16加速部署详解 1. 项目背景与核心价值 Ostrakon-VL-8B是一款专为零售与餐饮场景优化的多模态大模型,能够高效处理商品识别、货架分析等视觉任务。传统部署方案往往面临显存占用高、推理速度慢的问题,而本…...
OpenClaw智能相册管理:Qwen2.5-VL-7B自动分类与标注私人照片
OpenClaw智能相册管理:Qwen2.5-VL-7B自动分类与标注私人照片 1. 为什么需要智能相册管理? 每次打开手机相册,看到上万张杂乱无章的照片时,那种无力感想必很多人都深有体会。去年夏天,我在整理旅行照片时突然意识到—…...
实战演练:如何利用SQLMap快速检测银行储物柜管理系统的CVE-2023-0562漏洞
实战指南:SQLMap在银行储物柜管理系统漏洞检测中的高效应用 银行储物柜管理系统作为金融机构关键基础设施,其安全性直接关系到客户资产安全。近年来曝光的CVE-2023-0562漏洞再次提醒我们,即使是基础防护措施也可能存在致命缺陷。本文将手把手…...
Ostrakon-VL 代码辅助新体验:像使用 Codex 一样生成图像处理代码
Ostrakon-VL 代码辅助新体验:像使用 Codex 一样生成图像处理代码 1. 视觉编程的新可能 想象一下这样的场景:你看到一张经过"老照片修复"处理的图片效果,想在自己的项目中实现类似风格,却不知道从何下手编写代码。传统…...
图像去雾新思路:当无监督学习遇上注意力机制(CycleGAN+SK Fusion深度解析)
图像去雾新思路:当无监督学习遇上注意力机制(CycleGANSK Fusion深度解析) 清晨的山间薄雾给风景增添了几分朦胧美,但对于计算机视觉系统而言,这种大气散射效应却是清晰感知世界的障碍。从自动驾驶车辆的环境感知到卫星…...
【网络安全干货】黑客内网渗透零基础入门,超详细基础知识手把手教学
0x01 内网概述 内网也指局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的历程安排、电子邮件和传真通信服务等功能。 内…...
小程序支付实名认证跳转:从安卓兼容到iOS限制的实战处理方案
1. 小程序支付实名认证跳转的痛点解析 最近在开发一个保险行业的小程序时,遇到了一个让人头疼的问题:支付环节需要跳转到微支保小程序进行实名认证。最初的做法很简单粗暴,直接在页面加载时就调用wx.navigateToMiniProgram跳转。测试时发现&a…...
