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

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实现接口请求性能监控的步骤:

  1. 创建监听器类

    实现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("========================================");}
    }
    
  2. 注册监听器

    使用@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接口,覆盖其中的方法,如preHandlepostHandle、和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框架中&#xff0c;监控接口请求的性能可以通过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数据库设计的世界里&#xff0c;数据类型的选择是一项基础而又至关重要的任务。其中&#xff0c;INT数据类型因其广泛的应用和灵活性备受青睐。然而&#xff0c;围绕着INT(3)与INT(11)的具体差异&#xff0c;常常存在一些误解。本文旨在…...

Qt 窗口:菜单、工具与状态栏的应用

目录 引言&#xff1a; 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 在状态栏中显…...

学习必备好物有哪些?高三开学季好物推荐合集

新学期即将开启&#xff0c;学习必备好物有哪些&#xff1f;以下是特别为高三学生朋友们精心挑选的一系列好物推荐&#xff0c;旨在帮助大家在更快更好的选择&#xff0c;快来看看都有哪些吧&#xff01; 1、书客护眼大路灯Sun 书客是海内外知名的生物光学技术方案商&#xf…...

java的分类

目录 Java SE Java EE Java ME java主要分为三类&#xff0c;分别是Java SE&#xff0c;Java EE&#xff0c;Java ME。其中SE是EE和ME的基础。 Java SE 全名为Java Standard Edition&#xff0c;是 Java 平台的基础版本&#xff0c;为开发人员提供了构建和运行桌面应用程…...

基于火山引擎云搜索服务和豆包模型搭建 RAG 推理任务

大语言模型&#xff08;LLM&#xff0c;Large language model&#xff09;作为新一轮科技产业革命的战略性技术&#xff0c;其核心能力在于深层语境解析与知识融合。在生成式人工智能方向主要用于图像生成&#xff0c;书写文稿&#xff0c;信息搜索等。当下的 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流式回复效果的完整代码示例&#xff0c;并详细说明所需的依赖和配置。 1. 项目配置 构建工具: Maven 或 Gradle依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>sp…...

成功解决7版本的数据库导入 8版本数据库脚本报错问题

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 &#x1f393;擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号&#xff1a;热爱技术的小郑。回复 Java全套视频教程 或 前端全套视频…...

如何让RStudio使用不同版本的R

下面内容摘录自&#xff1a; 专栏问答&#xff1a;管理和选择不同的R&#xff0c;如何做好R的笔记_rstudio如何在不同的r版本中进行切换-CSDN博客 欢迎订阅我们专栏 问题一&#xff1a;如何发现RStudio需要安装和使用不同版本的R。这是为什么呢&#xff1f; R允许用户在同一系统…...

汽车免拆诊断案例 | 2011 款进口现代新胜达车智能钥匙系统有时失效

故障现象  一辆2011款进口现代新胜达车&#xff0c;搭载G4KE发动机&#xff0c;累计行驶里程约为26.3万km。车主进厂反映&#xff0c;有时进入车内按下起动按钮&#xff0c;发动机无法起动&#xff0c;且组合仪表黑屏。 故障诊断  接车后试车&#xff0c;车辆使用一切正常。…...

Count clock

写了半天不对&#xff0c;才注意到是十六进制的 - - 另外安装了vivado 哈哈哈哈&#xff0c;可以看看写的到底对不对 之前好多程序在 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、数据操作——增删改查 &#xff08;1&#xff09;增/插入&#…...

Qt .qm文件详解

Qt中的.qm文件是Qt翻译文件的一种&#xff0c;主要用于支持软件的多语言转换。在生成Qt应用程序时&#xff0c;qm文件会被包含进应用程序中&#xff0c;根据逻辑以显示对应语言的界面。 .qm文件的基本信息 格式&#xff1a;.qm文件是Qt应用程序中用于存储翻译文本的二进制文件…...

【计算机网络】UDP实战

其实经过这几天写的几种不同的UDP的简易客户端与服务端&#xff0c;还是很有套路的&#xff0c;起手式都是非常像的。 更多的难点对我来说反而是解耦&#xff0c;各种各样的function一用&#xff0c;回调函数一调&#xff0c;呕吼&#xff0c;就会懵一下。 对于这篇文章&#x…...

七、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制和JS颜色选择器改变灯珠颜色

本地代码集成离线iro.js库来添加一个颜色选择器控件&#xff0c;在无网络环境可以通过JavaScript将选中的颜色发送到服务器以改变LED颜色。以下是将iro.js集成到网页后的颜色图片。 Iro.js 地址API操作手册 color:change # 每当所选颜色发生变化时触发 - 无论是当用户与颜色选…...

Z 字形遍历二叉树

假设一个二叉树上各结点的权值互不相同。 我们就可以通过其后序遍历和中序遍历来确定唯一二叉树。 请你输出该二叉树的 ZZ 字形遍历序列----也就是说&#xff0c;从根结点开始&#xff0c;逐层遍历&#xff0c;第一层从右到左遍历&#xff0c;第二层从左到右遍历&#xff0c;…...

[Vue]Vue3从入门到精通-综合案例分析

一.Vue是什么&#xff1a; 概念&#xff1a;Vue是一个用于构建用户界面的渐进式的框架 以下的内容是自里向外的 声明式渲染(Vuejs核心包)组件系统(Vuejs核心包)客户端路由VueRouter大规模状态管理Vuex构建工具Webpack/Vite Vue的两种使用方式&#xff1a; Vue核心包开发-&…...

深度学习——神经网络(neural network)详解(二). 带手算步骤,步骤清晰0基础可看

深度学习——神经网络&#xff08;neural network&#xff09;详解&#xff08;二&#xff09;. 手算步骤&#xff0c;步骤清晰0基础可看 前文如下&#xff1a;深度学习——神经网络&#xff08;neural network&#xff09;详解&#xff08;一&#xff09;. 带手算步骤&#x…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...