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…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
