SpringBoot 接口耗时统计:7 种实用方法
·
使用 Spring AOP 统计接口耗时
Spring AOP 可以方便地对方法进行拦截,适合统计接口耗时。定义一个切面类,在方法执行前后记录时间差。
@Aspect
@Component
public class TimeCostAspect {
@Around("execution(* com.example.controller.*.*(..))")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed();
long end = System.currentTimeMillis();
System.out.println("Method " + joinPoint.getSignature().getName() + " cost: " + (end - start) + "ms");
return result;
}
}
使用 Filter 统计接口耗时
Filter 可以拦截所有请求,适合统计整个请求链路的耗时。在 doFilter 方法中记录请求开始和结束时间。
@Component
public class TimeCostFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
long start = System.currentTimeMillis();
chain.doFilter(request, response);
long end = System.currentTimeMillis();
System.out.println("Request cost: " + (end - start) + "ms");
}
}
使用 Interceptor 统计接口耗时
Interceptor 可以拦截 Controller 层的请求,适合统计接口耗时。在 preHandle 和 afterCompletion 方法中记录时间。
@Component
public class TimeCostInterceptor implements HandlerInterceptor {
private ThreadLocal<Long> startTime = new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
startTime.set(System.currentTimeMillis());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
long end = System.currentTimeMillis();
System.out.println("Request cost: " + (end - startTime.get()) + "ms");
}
}
使用 Actuator 监控接口耗时
Spring Boot Actuator 提供了丰富的监控端点,可以查看接口的耗时情况。配置 management.endpoints.web.exposure.include=metrics 后,访问 /actuator/metrics/http.server.requests 可以查看接口耗时统计信息。
使用 Micrometer 统计接口耗时
Micrometer 是一个监控指标库,可以与多种监控系统集成。配置 Micrometer 后,可以统计接口耗时并导出到 Prometheus 等监控系统。
@RestController
public class DemoController {
private final Timer timer;
public DemoController(MeterRegistry registry) {
this.timer = registry.timer("demo.controller.timer");
}
@GetMapping("/demo")
public String demo() {
return timer.record(() -> {
// 业务逻辑
return "Hello World";
});
}
}
使用日志框架统计接口耗时
在 Controller 方法中手动记录开始和结束时间,并通过日志框架输出耗时信息。
@RestController
public class DemoController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);
@GetMapping("/demo")
public String demo() {
long start = System.currentTimeMillis();
// 业务逻辑
long end = System.currentTimeMillis();
logger.info("Method demo cost: {}ms", end - start);
return "Hello World";
}
}
使用 Spring Boot 的 StopWatch 统计接口耗时
Spring 提供了 StopWatch 工具类,可以方便地统计代码块的耗时。
@RestController
public class DemoController {
@GetMapping("/demo")
public String demo() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 业务逻辑
stopWatch.stop();
System.out.println("Method demo cost: " + stopWatch.getTotalTimeMillis() + "ms");
return "Hello World";
}
}
更多推荐

所有评论(0)