Appearance
Spring Boot Actuator 与可观测性
应用真正上线之后,团队最怕的往往不是“功能没写出来”,而是服务出问题了,但不知道它现在到底发生了什么。这就是可观测性主线。
在 Spring Boot 生态里,Actuator 是这条线里最基础、最常见的入口之一。
这篇文章重点讲:
Actuator到底是什么- 它解决什么问题
- 健康检查、指标、信息端点分别在做什么
- 它和日志、链路追踪、监控平台是什么关系
- 企业里为什么说“有监控”不等于“可观测性就做好了”
1. 为什么企业应用一定要有可观测性
因为系统上线以后,真正的难点往往变成:
- 服务活着吗
- 请求慢在哪
- 错误是偶发还是持续
- 哪个下游在拖慢当前服务
- 资源是不是快打满了
如果没有统一观测能力,排障会非常被动。
所以可观测性最核心的目标不是“多几个面板”,而是让系统内部状态能被及时看见、理解和追踪。
2. Actuator 到底是什么
Spring Boot Actuator 可以看成 Spring Boot 提供的一组应用运行时管理与观测端点。
它解决的是:应用上线后,健康状态、指标信息、配置概况和部分运行时信息,如何有统一出口可供查看。
你也可以把它理解成给应用开了一组“运行时观察窗口”。
3. 它主要暴露哪些信息
最常见的几类通常包括:
- 健康检查
- 指标信息
- 应用信息
- 环境与配置概况
- Bean、映射、日志级别等运行时信息
这里要特别注意:Actuator 不是业务接口,而是运维和观测接口。
4. 一个最小接入示例
通常只要引入依赖:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>再配一部分端点暴露:
yaml
management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: always这样应用就会暴露一组基础观测端点。
5. health 端点到底在看什么
health 是最常见、也最先接入的一个端点。
它解决的是应用当前是否健康。
但“健康”不是只看进程还活着,还包括很多依赖资源状态,例如:
- 数据库是否可用
- Redis 是否可用
- 磁盘空间是否正常
例如:
json
{
"status": "UP"
}或者更详细一些:
json
{
"status": "UP",
"components": {
"db": { "status": "UP" },
"redis": { "status": "UP" }
}
}6. metrics 端点到底在看什么
metrics 解决的是应用运行过程中的指标数据怎么统一查看。
例如常见指标包括:
- JVM 内存
- 线程数
- HTTP 请求次数与耗时
- 数据库连接池状态
- 自定义业务指标
这条线特别重要,因为很多性能问题不是靠日志直接看出来的,而要靠指标趋势判断。
7. info、env、beans 这些端点分别是干什么的
7.1 info
更偏展示应用静态信息,例如:
- 应用名
- 版本
- 构建信息
7.2 env
更偏查看应用当前环境配置来源和属性。
7.3 beans
更偏查看容器里有哪些 Bean。
这些端点都很有用,但也要注意权限和暴露范围。
8. Actuator 和日志、链路追踪是什么关系
这部分一定要分开看。
8.1 Actuator
更偏当前运行状态和指标出口。
8.2 日志
更偏记录具体事件发生了什么。
8.3 链路追踪
更偏一次请求跨多个服务时,整条调用链怎么串起来。
所以要把边界看清:Actuator 只是可观测性的一部分,不等于全部可观测性。
9. 为什么说企业里要同时看日志、指标和链路
因为它们解决的问题并不一样。
| 能力 | 更适合回答的问题 |
|---|---|
| 日志 | 某次具体请求发生了什么 |
| 指标 | 系统整体趋势怎么样 |
| 链路追踪 | 一次请求跨服务时卡在哪一跳 |
真正完整的可观测性,通常要把这三类能力结合起来。
10. 自定义健康检查怎么做
企业里经常不止想看数据库、Redis 是否正常,还会想看:
- 第三方支付接口
- 核心配置是否加载成功
- 某个依赖服务是否可用
这时可以自定义健康检查。
例如:
java
@Component
public class DemoHealthIndicator implements HealthIndicator {
@Override
public Health health() {
boolean ok = true;
if (ok) {
return Health.up().withDetail("service", "demo").build();
}
return Health.down().withDetail("reason", "dependency timeout").build();
}
}11. 自定义指标为什么也很重要
系统里最关键的很多问题,并不总能靠 JVM 指标看出来。
例如你可能更关心:
- 下单成功率
- 支付失败次数
- 缓存命中率
- 队列积压长度
这时就需要自定义指标。
例如:
java
@Service
public class OrderService {
private final Counter createOrderCounter;
public OrderService(MeterRegistry meterRegistry) {
this.createOrderCounter = meterRegistry.counter("order.create.count");
}
public void createOrder() {
createOrderCounter.increment();
}
}12. Actuator 常见配置点
| 配置项 | 作用 |
|---|---|
management.endpoints.web.exposure.include | 指定暴露哪些端点 |
management.endpoint.health.show-details | 控制健康信息是否展示细节 |
management.server.port | 单独指定管理端口 |
management.metrics.tags.* | 给指标统一打标签 |
例如:
yaml
management:
server:
port: 9090
endpoints:
web:
exposure:
include: health,info,metrics,prometheus13. 和 Prometheus、Grafana 这些平台是什么关系
Actuator 自己不是完整监控平台。
把分工摊开看:
Actuator提供指标和状态出口Prometheus负责采集指标Grafana负责把指标可视化展示
也就是说:Actuator 更像应用侧的观测数据出口,而不是最终展示平台。
14. 工程上最容易踩的几个坑
14.1 误区一:把所有端点都直接暴露出去
这会带来明显安全风险。
14.2 误区二:有 Actuator 就等于可观测性做好了
不是。
日志、指标、链路追踪、告警体系都还要一起建设。
14.3 误区三:只看健康状态,不看趋势指标
很多问题在服务“还没挂”的时候,其实指标早就开始恶化了。
14.4 误区四:只盯技术指标,不看业务指标
CPU 正常不代表业务正常。
15. 一句话总结
Actuator 在 Spring Boot 里最核心的价值,是为应用提供统一的运行时观测出口;而企业里真正完整的可观测性,还要把健康检查、指标、日志、链路追踪和告警平台一起接成一条闭环。