本文目录导读:

- 方案一:使用 Spring Boot Actuator + Micrometer (最主流、最推荐)
- 方案二:纯 JDK 内置工具 (轻量级、无需框架)
- 方案三:配合外部监控系统 (生产级完整体系)
- 方案四:基于 AOP 实现方法级监控 (扩展案例)
- 监控的核心指标清单
- 总结选择建议
在Java中实现服务监控,通常有四个核心步骤:数据采集 → 指标暴露 → 数据存储/展示 → 告警。
下面为你介绍从简单到专业的几种实现方案,并提供具体代码案例。
使用 Spring Boot Actuator + Micrometer (最主流、最推荐)
这是Spring Boot项目监控的标准方案,Actuator负责暴露接口,Micrometer负责收集各类指标(内存、CPU、线程、HTTP请求等)。
引入依赖
<!-- Spring Boot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer 核心,Prometheus 注册表 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
配置文件 (application.yml)
management:
endpoints:
web:
exposure:
include: "*" # 暴露所有端点(生产环境建议缩小范围)
metrics:
tags:
application: ${spring.application.name} # 添加服务名标签
启动并验证
启动项目后访问 http://localhost:8080/actuator 可看到所有端点列表。
- 健康检查:
/actuator/health - 详细指标:
/actuator/metrics - Prometheus格式:
/actuator/prometheus
输出示例(prometheus格式):
jvm_memory_used_bytes{area="heap",id="G1 Eden Space",} 2.4E7
http_server_requests_seconds_count{method="GET",status="200",uri="/api/users",} 15.0
自定义业务指标 (关键案例)
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Timer;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class OrderService {
private final Counter orderCreatedCounter;
private final Timer orderCreateTimer;
// 通过构造器注入 MeterRegistry
public OrderService(MeterRegistry registry) {
this.orderCreatedCounter = Counter.builder("orders.created.total")
.description("总订单创建数")
.tag("app", "my-service")
.register(registry);
this.orderCreateTimer = Timer.builder("orders.create.duration")
.description("订单创建耗时")
.publishPercentiles(0.5, 0.95, 0.99) // P50, P95, P99
.register(registry);
}
public void createOrder() {
Timer.Sample sample = Timer.start(); // 开始计时
try {
// 业务逻辑
orderCreatedCounter.increment(); // 计数+1
} finally {
sample.stop(orderCreateTimer); // 记录耗时
}
}
}
纯 JDK 内置工具 (轻量级、无需框架)
如果项目不是Spring Boot,可以用JDK自带工具做基础监控。
使用 JMX (Java Management Extensions)
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.ThreadMXBean;
public class SimpleMonitor {
private final MemoryMXBean memoryBean;
private final ThreadMXBean threadBean;
public SimpleMonitor() {
this.memoryBean = ManagementFactory.getMemoryMXBean();
this.threadBean = ManagementFactory.getThreadMXBean();
}
public void printMetrics() {
// 堆内存
var heap = memoryBean.getHeapMemoryUsage();
System.out.printf("Heap: used=%d MB, max=%d MB%n",
heap.getUsed() / (1024*1024), heap.getMax() / (1024*1024));
// 活跃线程
int threadCount = threadBean.getThreadCount();
System.out.println("Active threads: " + threadCount);
// 可以定期执行并写入日志或暴露HTTP接口
}
}
配合简单的 HTTP Server 暴露指标
import com.sun.net.httpserver.HttpServer;
import java.net.InetSocketAddress;
public class PrometheusExporter {
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(8081), 0);
server.createContext("/metrics", exchange -> {
String metrics = collectMetricsAsString(); // 自行拼接Prometheus格式
exchange.sendResponseHeaders(200, metrics.length());
exchange.getResponseBody().write(metrics.getBytes());
exchange.close();
});
server.start();
}
private static String collectMetricsAsString() {
// 收集内存、线程、GC、自定义指标等
return "# HELP heap_used 堆内存使用量\nheap_used 256000000\n";
}
}
配合外部监控系统 (生产级完整体系)
将采集到的指标发送到监控后台,形成可视化和告警。
架构图
flowchart LR
A[Java应用<br/>Micrometer/Actuator] -->|/actuator/prometheus| B[Prometheus<br/>时间序列数据库]
B --> C[Grafana<br/>可视化仪表盘]
B --> D[Alertmanager<br/>告警通知]
D --> E[钉钉/邮件/短信]
配置示例
-
Prometheus配置文件 (prometheus.yml):
scrape_configs: - job_name: 'java-app' metrics_path: '/actuator/prometheus' static_configs: - targets: ['localhost:8080'] -
Grafana:导入
JVM (Micrometer)官方仪表盘模板 ID:12856。
基于 AOP 实现方法级监控 (扩展案例)
当需要无侵入地监控所有 @RestController 或特定 Service 方法时。
@Aspect
@Component
public class MethodMonitorAspect {
private final MeterRegistry registry;
public MethodMonitorAspect(MeterRegistry registry) {
this.registry = registry;
}
@Around("@annotation(org.springframework.web.bind.annotation.GetMapping)") // 拦截所有GET请求
public Object monitorMethod(ProceedingJoinPoint pjp) throws Throwable {
String methodName = pjp.getSignature().toShortString();
// 创建计数器
Counter.builder("method.calls")
.tag("method", methodName)
.register(registry)
.increment();
// 计时
Timer.Sample sample = Timer.start();
try {
return pjp.proceed();
} catch (Exception e) {
// 记录异常
Counter.builder("method.errors")
.tag("method", methodName)
.register(registry)
.increment();
throw e;
} finally {
sample.stop(Timer.builder("method.duration")
.tag("method", methodName)
.register(registry));
}
}
}
监控的核心指标清单
| 分类 | 具体指标 | 监控目的 |
|---|---|---|
| JVM | 堆/非堆内存、GC次数/耗时、线程数、类加载数 | 内存泄漏、GC停顿、死锁 |
| 系统 | CPU使用率、磁盘IO、网络流量 | 系统是否过载 |
| 应用 | QPS、请求耗时P99、错误率、慢SQL | 接口性能、故障发现 |
| 中间件 | 连接池活跃数、队列积压、缓存命中率 | 数据库、MQ、Redis状态 |
总结选择建议
- 单体应用快速使用 → 方案一(Spring Boot Actuator + Micrometer)
- 老旧项目无Spring → 方案二(JDK JMX + 自定义HTTP接口)
- 完整生产环境 → 方案一 + 集成Prometheus + Grafana + 告警
- 方法级细粒度监控 → 方案四(AOP)作为补充
代码中使用的核心库(均可从Maven中央仓库获取):
<!-- Spring Boot 2.x/3.x 均已内置 acturator -->
<!-- Micrometer 核心 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
如果需要了解特定中间件(如数据库连接池、Kafka消费者)的监控代码,可以进一步说明。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播