最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
01-如何监控接口调用状态
时间:2026-05-30 13:30:02 编辑:袖梨 来源:一聚教程网
在SpringBoot项目中坚控接口调用情况是提升系统可观测性的重要手段,本文详细介绍五种实现方案及其适用场景。
01-如何接口调用情况?

章节阅读路线图 ️
- AOP 切面方案(最推荐) → 使用 Spring AOP 无侵入式坚控所有接口
- 自定义注解方案 → 选择性坚控,只针对关键接口
- HandlerInterceptor 拦截器方案 → 基于 Spring MVC 拦截器实现
- Micrometer + Actuator 生产级方案 → 接入 Prometheus + Grafana 可视化坚控
- 方案对比与总结 → 根据场景选择最合适的方案
1. AOP 切面方案(最推荐)
通过Spring AOP特性,我们可以创建一个切面类来统一拦截Controller方法,无需修改原有代码即可实现接口坚控功能。
1.1 引入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-aopartifactId>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>2.0.xversion>
dependency>
1.2 编写切面类
package com.example.aspect;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
@Slf4j
@Aspect
@Component
public class ApiMonitorAspect {
private final Map callCountMap = new ConcurrentHashMap<>();
@Pointcut("execution(* com.example.controller.*.*(..))")
public void controllerPointcut() {}
@Around("controllerPointcut()")
public Object monitorApi(ProceedingJoinPoint joinPoint) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String methodName = joinPoint.getTarget().getClass().getSimpleName() + "." + joinPoint.getSignature().getName();
long currentCount = callCountMap.computeIfAbsent(methodName, k -> new AtomicLong(0)).incrementAndGet();
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long elapsed = System.currentTimeMillis() - startTime;
log.info("接口坚控信息:n 请求地址: {} {}n 接口方法: {}n 调用次数: {}n 响应耗时: {}ms",
request.getMethod(), request.getRequestURL(),
methodName, currentCount, elapsed);
return result;
}
}
1.3 输出示例
2026-05-28 14:30:22.156 [http-nio-8080-exec-1] INFO c.e.aspect.ApiMonitorAspect -
接口坚控信息:
请求地址: GET http://localhost:8080/api/user/list
接口方法: UserController.getUserList
调用次数: 1
响应耗时: 45ms
2. 自定义注解方案(选择性坚控)
通过自定义注解可以精确控制需要坚控的接口范围,避免对所有接口进行坚控。
2.1 定义注解
package com.example.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Monitored {
String value() default "";
}
2.2 修改切面类
@Slf4j
@Aspect
@Component
public class MonitoredApiAspect {
@Pointcut("@annotation(com.example.annotation.Monitored)")
public void monitoredPointcut() {}
@Around("monitoredPointcut() && @annotation(monitored)")
public Object monitorAnnotatedApi(ProceedingJoinPoint joinPoint, Monitored monitored) throws Throwable {
// 坚控逻辑实现
}
}
3. HandlerInterceptor 拦截器方案
通过实现HandlerInterceptor接口,可以在请求处理前后进行拦截和坚控。
3.1 实现拦截器
@Slf4j
@Component
public class ApiMonitorInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 请求前处理逻辑
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 请求后处理逻辑
}
}
4. Micrometer + Actuator 生产级方案
结合Micrometer和Spring Boot Actuator,可以实现生产环境下的接口坚控需求。
4.1 引入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>io.micrometergroupId>
<artifactId>micrometer-registry-prometheusartifactId>
dependency>
5. 方案对比与总结
本文详细介绍了五种接口坚控方案,从开发调试到生产环境坚控,开发者可根据实际需求选择最合适的实现方式。