Spring Boot - 通过ApplicationListener实现接口请求的性能监控

news2024/9/24 11:28:09

文章目录

  • 概述
  • 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> {
    
      @Override
      public 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和kw
                String.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);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        request.setAttribute("startTime", System.currentTimeMillis());
        return true;
    }

    @Override
    public 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:支持云原生应用监控,提供全面的性能数据。

优点:提供详细的性能分析报告和可视化,易于识别和解决性能问题。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java日志系列】日志概述

目录 前言 一、日志概述 二、日志文件 1. 调试日志 2. 系统日志 三、日志框架 1. 日志框架的作用 2. 日志框架的价值 3. 市面上流行的日志框架 4. 日志门面和日志实现的区别 总结 前言 在软件开发中&#xff0c;日志记录是一项至关重要的任务。无论是简单的命令行应…

微服务架构-SpringCloud

1.单体应用架构 将项目所有模块(功能)打成jar或者war&#xff0c;然后部署一个进程。 优点&#xff1a; 部署简单&#xff1a;由于是完整的结构体&#xff0c;可以直接部署在一个服务器上即可。技术单一&#xff1a;项目不需要复杂的技术栈&#xff0c;往往一套熟悉的技术栈就…

Netty技术全解析:LineBasedFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

【leetcode】杨辉三角(Java语言描述)

杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] …

XIAOJUSURVEY 重磅升级,推出图形化逻辑编排能力

&#x1f389;&#x1f389;&#x1f389;XIAOJUSURVEY 是滴滴开源的企业级问卷系统&#xff0c;现已重磅升级&#xff01;&#xff01;&#xff01; 本次升级基于自研规则引擎&#xff0c;全面支持复杂的问卷逻辑编排&#xff0c;实现了显示逻辑与跳转逻辑的无缝整合。突破了…

MySQL Galera Cluster 部署与介绍

目录 主要特点 组件 一. 环境准备 二. 配置 1. 配置 galera1 主机的my.cnf的文件 2. 配置 galera2 主机的my.cnf的文件 3. 配置 galera3 主机的my.cnf的文件 4. 在给galera1 主机的my.cnf的文件增加节点 5. 写入数据验证同步 6. 配置 galera4 主机的my.cnf的文件 M…

线性回归Pytorch方法

借助 PyTorch 实现深度神经网络 - 线性回归 PyTorch 方法 - 第 3 周 | Coursera 随机梯度下降和数据加载器 在每个epoch中&#xff0c;使用一个样本进行更新的方法称为随机梯度下降&#xff0c;而使用所有样本进行更新的方法称为批量梯度下降。 随机梯度下降&#xff1a; 随…

第五代数字产业园入驻西安,西安国际数字影像产业园究竟能带来哪些颠覆性变革?

西安&#xff0c;这座承载着千年历史文化底蕴的古老城市&#xff0c;在时代的洪流中不断焕发出新的生机与活力。如今&#xff0c;西安第五代数字产业园入驻西安&#xff0c;犹如一颗璀璨的新星在这片土地上冉冉升起&#xff0c;为这座城市的发展注入了强大的动力。而在这一重大…

AFSim 仿真系统---- 通信、传感器与干扰系统方程

概述 本文档旨在描述在WSF中对象之间交互所使用的方程和算法。这包括&#xff1a; 传感器交互通信交互干扰&#xff08;干扰&#xff09;交互 常见无线电频率方程 WSF使用一套通用类来封装涉及无线电频率&#xff08;RF&#xff09;交互的组件&#xff08;实际上&#xff0…

基于B/S模式的JSP二手车交易网站

你好&#xff0c;我是计算机专业的学生&#xff0c;专注于Web开发。希望我的论文能够为您提供一些有价值的信息。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;ECLIPSE、Tomcat 系统展示 首页 用户界面 管理员界面 汽车评…

新加坡服务器延迟大吗?如何进行优化

新加坡服务器延迟大吗&#xff1f;新加坡服务器的延迟通常在全国平均延迟111ms左右&#xff0c;其中移动网络约为90ms&#xff0c;联通网络106ms&#xff0c;电信网络最低约为85ms。为了进行优化&#xff0c;一般可以采取使用CDN、优化路由线路、增加带宽和服务器升级等方法。 …

VBA高级应用30例应用3在Excel中的ListObject对象:创建表

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

Linux 内核源码分析---简单文件系统

顺序文件 debugfs 文件系统 允许只用几个函数调用&#xff0c;就实现一个双向的调试接口。 小的文件系统中的文件&#xff0c;通常用户层是 从头到尾顺序读取 的&#xff0c;其内容可能是遍历一些数据项创建的。 kprobe 机制包含了到上述 debugfs文件系统 的一个接口。一个顺…

【模电笔记】——集成运算放大电路

tips&#xff1a;本章节的笔记已经打包到word文档里啦&#xff0c;建议大家下载文章顶部资源&#xff08;有时看不到是在审核中&#xff0c;等等就能下载了。手机端下载后里面的插图可能会乱&#xff0c;建议电脑下载&#xff0c;兼容性更好且易于观看&#xff09;&#xff0c;…

利用学校资源访问scientdirect等国外数据库

就直接点view pdf这样的下载按钮&#xff0c;会让你输入组织&#xff0c;搜索找到学校的名字&#xff0c;接下来可以能会要求输入学校邮箱或者其他身份认证信息&#xff0c;最后就可以享受学校已经出过钱买的服务啦&#xff01;如果不用那么你每个学期大几千的学费简直是暴殄天…

定制你的项目工作流:最适合的文档管理解决方案

国内外主流的10款项目文档管理软件对比&#xff1a;PingCode、Worktile、Teambition、Tapd、Tower、Confluence、Notion、Dropbox Paper、Quip、Basecamp。 在面对项目管理的复杂性时&#xff0c;选择合适的文档管理工具可以显著提高效率和团队协作。许多团队在文档管理上遭遇混…

灰度宣布推出SUI加密投资信托基金

灰度&#xff0c;这家推出受欢迎的BTC和ETH交易所交易基金&#xff08;ETF&#xff09;的投资公司&#xff0c;于8月7日宣布将开始提供两种新的加密基金Grayscale Sui Trust和Grayscale Bittensor Trust&#xff0c;这些基金投资于Layer-1区块链Sui&#xff08;SUI&#xff09;…

RTT-网络组件-AT命令-未完成

AT指令文档 调用树 at_client_init();at_client_para_init();client_parser();struct at_client {rt_device_t device;at_status_t status;char end_sign;char *send_buf;/* The maximum supported send cmd length */rt_size_t send_bufsz;/* The length of last cmd */rt_si…

Prometheus+Grafana-2-Linux监控-四种指标类型

一、概念 1.时间序列 安装完成后prometheus会暴露一个/metrics的HTTP服务&#xff0c;默认会加上/metrics&#xff0c;Prometheus就会采集这里面的样本数据。 样本 ​ 样本数据会以时间序列的方式保存在内存数据库中&#xff0c;并且定时保存到硬盘上&#xff0c;时间…

CloudCompare—点云切片

文章目录 一、整体功能展示1、必要参数2、其他选项二、代码实现1、提取平面上的包络线2、将点投影到二维平面上3、提取二维凸包三、算法原理参考资料一、整体功能展示 整个点云切片的步骤如下动图所示: 激活点云后,选择切片功能(小立方盒),在点云视图中显示工具栏框,工具…