当前位置:   article > 正文

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

servletrequesthandledevent


在这里插入图片描述


概述

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("========================================");
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  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;
    }

}
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

访问 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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

优点:能够灵活控制每个请求的处理过程,精确测量请求耗时。

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=*
  • 1

优点:集成简单,提供丰富的监控端点,适合Spring Boot应用。

4. APM工具

概述:应用性能管理(APM)工具可以帮助全面监控和分析应用性能,识别瓶颈并优化性能。

常用工具

  • Elastic APM:与Elastic Stack整合,提供应用性能监控和日志管理。
  • Datadog:支持云原生应用监控,提供全面的性能数据。
  • Skywalking:支持云原生应用监控,提供全面的性能数据。

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

在这里插入图片描述

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号