楼层: 首页/ 软件技术/ Spring Boot 3.5/ Actuator:应用的体检面板
10

Actuator:应用的体检面板

Actuator & Monitoring

应用上线后,你怎么知道它活着?内存吃了多少?配置加载了哪些?Actuator 内置了一组 HTTP 端点,暴露这些运行时信息。生产环境把它接进 Prometheus + Grafana,就是一套监控。

端点返回什么
/actuator/health健康状态:UP / DOWN。负载均衡器靠它探活。
/actuator/info应用自定义信息,从配置文件读。
/actuator/metricsJVM 内存、线程数、HTTP 请求耗时等指标。
/actuator/env所有环境变量和配置项(含脱敏)。
/actuator/beans容器里所有 Bean 的清单和依赖关系。
/actuator/mappings所有 URL 路径对应的 Controller 方法。

application.yml 开启端点

management: endpoints: web: exposure: include: health,info,metrics # 只暴露这几个,别全暴露 endpoint: health: show-details: when-authorized

定时任务:@Scheduled

Spring Boot 自带定时任务,不用装 Quartz。主启动类加 @EnableScheduling,业务方法贴 @Scheduled 就行。

每天凌晨 2 点跑一次统计任务

// 主启动类上加 @EnableScheduling @SpringBootApplication @EnableScheduling public class DemoApplication { ... } @Component public class ReportTask { // cron 表达式:秒 分 时 日 月 周 @Scheduled(cron = "0 0 2 * * ?") public void dailyReport() { System.out.println("每天凌晨 2 点跑一次报表"); } // 固定间隔:每 30 秒一次 @Scheduled(fixedDelay = 30000) public void heartbeat() { System.out.println("心跳"); } }

异步方法:@Async 别让主线程干等

接口里要"发短信、发邮件、写日志",这些不该让用户等着——主启动类加 @EnableAsync,方法贴 @Async,Spring 自动丢到线程池里异步跑,主线程立刻返回。

// 主启动类:@EnableAsync @Async public void sendEmail(String to) { // 这个方法在另一个线程里跑,调用方不等它 mailSender.send(to); } // 想拿到异步结果:返回 CompletableFuture @Async public CompletableFuture<Report> asyncReport() { Report r = buildReport(); return CompletableFuture.completedFuture(r); }
@Async 自调用不生效

和 @Transactional 一样,@Async 靠代理生效,同类内部 this 调用不走代理,异步失效。要从另一个 Bean 调进来。另外默认线程池很小,高并发场景要自己配 ThreadPoolTaskExecutor,别让任务排队堆积。

本章面试题 · 第 10 章(Actuator)

1.(概念题)Actuator 是什么?常用端点有哪些?

查看答案

答案:它给应用加了一套 HTTP/JMX 监控端点:/health(健康检查)、/metrics(指标)、/env(配置)、/loggers(动态改日志级别)、/info。K8s 用 /health 做存活探针。解析:默认只暴露 /health 和 /info,其他要在 yml 里 management.endpoints.web.exposure.include 打开。

2.(安全题)Actuator 端点能不能直接暴露到公网?

查看答案

答案:不能。/env、/heapdump 这类端点会泄露配置和内存,必须加 Spring Security 认证,或只在内网/管理端口暴露。解析:生产环境一定要收敛暴露的端点并加权限控制。