Spring Boot Actuator 监控

候选人小沈在面试滴滴 P6 时,面试官问道:

"Spring Boot Actuator 了解吗?"

小沈说:"用过,提供了很多监控端点..."

面试官追问:"怎么自定义 Actuator 端点?"

小沈说:"用 @Endpoint 注解..."

面试官继续追问:"健康检查是怎么判断服务是否健康的?"

小沈答不上来。

【面试官心理】 这道题我用来测试候选人对 Spring Boot 生产可观测性的理解。Actuator 是 Spring Boot 官方提供的监控方案,能说清端点、自定义指标、健康检查原理的,是有生产经验的候选人。


一、核心问题 🔴

1.1 问题拆解

第一层:端点

  • "Actuator 提供了哪些端点?"
  • "health 端点能显示什么信息?"

第二层:配置

  • "怎么暴露 Actuator 端点?"
  • "怎么保护端点,不让外人访问?"

第三层:自定义

  • "怎么自定义 Actuator 端点?"
  • "怎么自定义健康检查?"

1.2 标准回答

P5 回答:常用端点

端点路径说明
/actuator/healthGET健康检查
/actuator/infoGET应用信息
/actuator/metricsGET指标数据
/actuator/envGET环境变量
/actuator/beansGET容器中的 Bean
/actuator/conditionsGET自动配置条件

1.3 追问升级

追问 1:自定义端点

// 定义自定义端点
@Endpoint(id = "custom", enableByWeb = true)
@Component
public class CustomEndpoint {

    @ReadOperation
    public Map<String, Object> customInfo() {
        Map<String, Object> info = new HashMap<>();
        info.put("status", "running");
        info.put("version", "1.0.0");
        return info;
    }

    @WriteOperation
    public String reloadConfig() {
        // 执行某些操作
        return "config reloaded";
    }
}

追问 2:自定义健康检查

// 自定义健康指标
@Component
public class DatabaseHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        try {
            // 检查数据库连接
            boolean healthy = checkDatabase();
            if (healthy) {
                return Health.up()
                    .withDetail("database", "MySQL")
                    .withDetail("status", "connected")
                    .build();
            } else {
                return Health.down()
                    .withDetail("error", "Connection failed")
                    .build();
            }
        } catch (Exception e) {
            return Health.down(e).build();
        }
    }
}

二、面试总结

Spring Boot Actuator 是生产环境监控的基础,配合 Prometheus 和 Grafana 可以构建完整的可观测性体系。