如何获取Spring Boot微服务自动重启的时间戳
答案
完全可以在当前微服务内部实现该需求,无需依赖外部服务或组件。
Spring Cloud Config 配置变更触发的应用重启,本质是Spring应用上下文的重载重启,整个重启过程的生命周期事件都会在微服务进程内正常抛出,你只需要绑定对应的生命周期节点,就能准确记录重启时的时间戳。
可直接落地的实现方式
1. 基础实现:记录所有重启/启动的时间戳
通过监听Spring Boot的应用就绪事件即可实现,不管是服务首次启动,还是配置变更触发的重启,上下文初始化完成、服务可以正常接收请求时,都会触发ApplicationReadyEvent,在事件处理逻辑中记录时间戳即可。
import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Component public class RestartTimeRecorder { // 存储最近一次重启的时间戳,可按需扩展为列表存储历史重启记录 private long lastRestartTimestamp; @EventListener public void handleAppReady(ApplicationReadyEvent event) { lastRestartTimestamp = System.currentTimeMillis(); // 按需扩展:打印日志、写入本地存储、暴露给监控接口均可 System.out.printf("应用完成重启,时间戳:%d%n", lastRestartTimestamp); } public long getLastRestartTimestamp() { return lastRestartTimestamp; } }
2. 扩展:区分配置变更触发的重启
如果需要把配置中心变更触发的重启和普通发布重启做区分,可以额外监听配置变更事件做标记:
import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Component public class ConfigChangeMarker { // 标记下一次重启是否由配置中心变更触发 public static volatile boolean isTriggerByConfigUpdate = false; @EventListener public void handleConfigChange(EnvironmentChangeEvent event) { isTriggerByConfigUpdate = true; } }
在之前的RestartTimeRecorder的事件处理逻辑中,判断该标记值即可区分重启触发源,记录完时间戳后把标记重置为false即可。
注意事项
- 不要通过静态代码块、类初始化逻辑记录时间:如果是Spring上下文级别的重启,不会重新初始化JVM加载的类,静态逻辑只会在服务首次启动时执行一次,拿到的时间戳不准。
- 如果需要留存历史重启记录,不要把时间戳只存在内存变量中,可以在监听器逻辑里追加写入本地日志文件,避免进程完全退出后记录丢失。
- 如果服务接入了Spring Boot Actuator,可以自定义info端点或者健康检查端点,把记录的重启时间戳暴露出去,方便监控系统采集告警。
内容的提问来源于stack exchange,提问作者user15499060
相关产品推荐
相关产品推荐

