Spring Boot Actuator 是 Spring Boot 生态中用于实现应用监控与管理的关键模块,为生产级应用提供了开箱即用的运维能力。本文将深入剖析其核心机制,并通过实战案例演示如何构建企业级的应用监控体系。
端点作为 Actuator 的核心交互接口,通过 HTTP 和 JMX 两种协议暴露:
类型 | 协议支持 | 典型应用场景 | 示例端点 |
---|---|---|---|
原生端点 | HTTP/JMX | 基础监控 | /health, /metrics |
扩展端点 | HTTP | 自定义业务监控 | /features |
云原生端点 | JMX | 容器环境适配 | /cloudfoundry |
management:
endpoints:
web:
exposure:
include: health,metrics,prometheus
base-path: /ops
path-mapping:
health: service-status
jmx:
exposure:
exclude: env
endpoint:
health:
show-details: when_authorized
roles: MONITOR
健康检查是系统可用性的第一道防线,支持分层检测和聚合展示:
@Component
public class PaymentServiceHealthIndicator extends AbstractHealthIndicator {
@Autowired
private PaymentClient paymentClient;
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
boolean isHealthy = paymentClient.ping();
if (isHealthy) {
builder.up()
.withDetail("version", "1.2.3")
.withDetail("responseTime", paymentClient.getLatency());
} else {
builder.down()
.withException(paymentClient.getLastError());
}
}
}
基于 Micrometer 的指标系统支持多维度数据采集:
@Service
public class OrderMetricsService {
private final Counter orderCounter;
private final Timer orderProcessingTimer;
public OrderMetricsService(MeterRegistry registry) {
orderCounter = Counter.builder("orders.total")
.tag("region", System.getProperty("region"))
.register(registry);
orderProcessingTimer = Timer.builder("orders.processing.time")
.publishPercentiles(0.5, 0.95)
.register(registry);
}
public void trackOrder(Order order) {
orderCounter.increment();
orderProcessingTimer.record(() -> processOrder(order));
}
}
构建全链路监控系统的关键步骤:
@RestController
public class OrderController {
@Autowired
private Tracer tracer;
@PostMapping("/orders")
public ResponseEntity<?> createOrder(@RequestBody Order order) {
Span span = tracer.nextSpan().name("createOrder");
try (Scope scope = tracer.withSpan(span)) {
span.tag("order.amount", order.getAmount().toString());
// 业务处理逻辑
return ResponseEntity.ok().build();
} finally {
span.end();
}
}
}
集成 Prometheus + Grafana 的完整配置:
scrape_configs:
- job_name: 'spring-actuator'
metrics_path: '/ops/prometheus'
static_configs:
- targets: ['app1:8080', 'app2:8080']
basic_auth:
username: monitor
password: ${PROM_PASSWORD}
{
"panels": [{
"type": "graph",
"title": "JVM Memory Usage",
"targets": [{
"expr": "sum(jvm_memory_used_bytes{area=\"heap\"}) by (instance)"
}]
}]
}
构建分层的安全防护体系:
@Configuration
@EnableWebSecurity
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.requestMatcher(EndpointRequest.toAnyEndpoint())
.authorizeRequests()
.requestMatchers(EndpointRequest.to("health")).permitAll()
.requestMatchers(EndpointRequest.to("info")).hasRole("VIEWER")
.anyRequest().hasRole("ADMIN")
.and()
.httpBasic()
.and()
.csrf().disable();
}
}
management:
metrics:
enable:
jvm: true
system: true
logback: false
endpoint:
metrics:
cache:
time-to-live: 60s
@Bean
public ExecutorService monitoredExecutor() {
ThreadPoolExecutor executor = new ThreadPoolExecutor(...);
Metrics.gauge("executor.queue.size", executor, e -> e.getQueue().size());
return executor;
}
基于自定义指标的 HPA 配置:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: order-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: order-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: orders_per_second
target:
type: AverageValue
averageValue: 100