SpringBoot集成Watchdog的完整步骤教学

 更新时间:2025年09月02日 09:53:14   作者:风象南  
这篇文章主要为大家详细介绍了SpringBoot中集成Watchdog的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

1. 为什么需要 Watchdog

很多 Spring Boot 应用在生产环境里遇到过类似问题

看似存活,实则不可用/actuator/health 依然返回 200,但线程池/GC 已经彻底卡死

监控延迟发现:Prometheus 抓到的是几分钟后的异常

人工干预成本高:只能 SSH 上去 kill -9 或重启服务

解决思路

应用层自检:Actuator、线程池监控、自愈脚本

系统级兜底:Linux Watchdog

本文重点介绍 如何在 Linux 上安装配置 watchdog 并与 SpringBoot 集成

2. Linux Watchdog 简介

Linux Watchdog 本质是一个内核驱动,通常通过  /dev/watchdog 设备暴露给用户空间。
它的特点:

  • 需要用户进程定时“喂狗”(写入数据);
  •  一旦超过设定时间没被喂 → Watchdog 触发动作(重启系统/关闭电源/触发 NMI 等);
  • 属于 最后兜底机制,防止应用假死。

3. 安装与配置 Watchdog

3.1 安装 watchdog 服务

在常见的 Linux 发行版中,watchdog 通常不是默认安装的,需要手动安装:

Debian/Ubuntu:

sudo apt-get update
sudo apt-get install watchdog

CentOS/RHEL/UOS:

sudo yum install watchdog

安装完成后,会得到:

  • 配置文件:/etc/watchdog.conf
  • systemd 服务:watchdog.service

3.2 加载内核驱动

常见的 Watchdog 驱动有:

  • Intel 平台:iTCO_wdt
  • AMD 平台:sp5100_tco
  • 虚拟化环境(QEMU/KVM):softdog

检查是否支持:

ls /lib/modules/$(uname -r)/kernel/drivers/watchdog/

加载驱动,例如:

sudo modprobe iTCO_wdt     # Intel 芯片
sudo modprobe softdog soft_panic=1 # 如果没有硬件 watchdog,可用软件模拟

加载后应该能看到设备文件:

ls /dev/watchdog*
# 输出类似:
# /dev/watchdog  /dev/watchdog0

3.3 配置 watchdog 服务

编辑 /etc/watchdog.conf

以下为几项核心配置

watchdog-device = /dev/watchdog
interval = 5
max-load-1 = 24
min-memory = 1
realtime = yes
priority = 1

解释:

  • watchdog-device → 使用哪个 watchdog 设备;
  • interval → 心跳间隔(秒);
  • max-load-1 → 负载过高时触发重启;
  • min-memory → 可用内存低于阈值时触发重启。

3.4 启动并验证服务

sudo systemctl enable watchdog
sudo systemctl start watchdog
sudo systemctl status watchdog

验证 watchdog 是否正在运行:

dmesg | grep watchdog
# 或者:
journalctl -u watchdog

4. SpringBoot 集成 Watchdog

在系统 watchdog 运行的基础上,我们让 SpringBoot 主动与它交互,实现应用层喂狗逻辑。

Watchdog 喂狗任务

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@Component
public class WatchdogService implements CommandLineRunner {

    private FileOutputStream watchdog;

    @Override
    public void run(String... args) {
        // 先执行 shell 命令安装 softdog 并启动 watchdog 服务
        String[] commands = {
                "modprobe -r softdog",
                "modprobe softdog soft_panic=1",
                "systemctl stop watchdog",
                "systemctl start watchdog"
        };

        for (String cmd : commands) {
            try {
                Process process = new ProcessBuilder("/bin/sh", "-c", cmd)
                        .inheritIO()  // 输出到控制台
                        .start();
                int exitCode = process.waitFor();
                if (exitCode != 0) {
                    System.err.println("命令失败: " + cmd);
                }
            } catch (IOException | InterruptedException e) {
                System.err.println("执行命令出错: " + cmd + ",原因:" + e.getMessage());
            }
        }

        // 打开 /dev/watchdog 喂狗
        try {
            watchdog = new FileOutputStream("/dev/watchdog");
        } catch (IOException e) {
            System.err.println("无法打开 /dev/watchdog,请检查驱动和权限");
            return;
        }

        Executors.newSingleThreadScheduledExecutor()
                .scheduleAtFixedRate(this::feedDog, 0, 5, TimeUnit.SECONDS);

        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            try {
                if (watchdog != null) {
                    watchdog.close(); // 防止误触发
                }
            } catch (IOException ignored) {}
        }));
    }

    private void feedDog() {
        try {
            watchdog.write("1".getBytes());
            watchdog.flush();
        } catch (IOException e) {
            System.err.println("喂狗失败:" + e.getMessage());
        }
    }
}

工作机制:

  • 每 5 秒喂狗一次;
  • 如果 JVM 卡死(GC、死锁、线程阻塞),喂狗失败,系统触发 watchdog → 强制重启;
  • 在优雅停机时关闭 watchdog,避免误报。

5. 实战场景

线程池卡死:定时任务无法运行 → watchdog 超时 → 系统重启。

Full GC 停顿:JVM 挂起 → watchdog 未被喂 → 自动恢复。

进程死锁:所有线程卡死 → watchdog 兜底保护。

6. 最佳实践:应用层 + 系统层双保险

应用层自检

1、使用 Spring Boot Actuator 监控线程池、GC、响应时间

2、发现异常时尝试自愈(释放锁、降级、重启线程池)

系统层 watchdog
兜底方案,确保“再怎么挂死,系统都会拉起”。

这种 双保险模式 特别适合无人值守、远程运维的场景(如边缘计算设备、IoT 网关、金融终端)。

7. 总结

1、Linux Watchdog 不是默认可用,需要 安装软件包、加载驱动、配置 systemd 服务

2、Spring Boot 可以轻松集成 watchdog 喂狗机制;

3、Watchdog 结合应用层监控,可以构建 自愈能力极强的高可用系统

到此这篇关于SpringBoot集成Watchdog的完整步骤教学的文章就介绍到这了,更多相关SpringBoot集成Watchdog内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • java开发就业信息管理系统

    java开发就业信息管理系统

    这篇文章主要为大家详细介绍了java开发就业信息管理平台,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 解决redisTemplate向redis中插入String类型数据时出现乱码问题

    解决redisTemplate向redis中插入String类型数据时出现乱码问题

    这篇文章主要介绍了解决redisTemplate向redis中插入String类型数据时出现乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java实战之多线程模拟站点售票

    Java实战之多线程模拟站点售票

    今天带大家来练习Java实战,文中多线程模拟站点售票这个问题作了详细的介绍,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • SpringBoot轻松实现ip解析(含源码)

    SpringBoot轻松实现ip解析(含源码)

    IP地址一般以数字形式表示,如192.168.0.1,IP解析是将这个数字IP转换为包含地区、城市、运营商等信息的字符串形式,如“广东省深圳市 电信”,这样更方便人理解和使用,本文给大家介绍了SpringBoot如何轻松实现ip解析,需要的朋友可以参考下
    2023-10-10
  • Java8接口默认静态方法及重复注解原理解析

    Java8接口默认静态方法及重复注解原理解析

    这篇文章主要介绍了Java8接口默认静态方法及重复注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 使用vscode搭建javaweb项目的详细步骤

    使用vscode搭建javaweb项目的详细步骤

    我个人是很喜欢VsCode的,开源免费、功能全面,所以为了方便,我把我几乎所有的运行都集成到了VsCode上来,JavaWeb也不例外,下面这篇文章主要给大家介绍了关于使用vscode搭建javaweb项目的相关资料,需要的朋友可以参考下
    2022-11-11
  • springboot项目获取请求头当中的token的方法

    springboot项目获取请求头当中的token的方法

    本文主要介绍了springboot项目获取请求头当中的token的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • quartz定时执行任务,并配置web.xml的操作方法

    quartz定时执行任务,并配置web.xml的操作方法

    下面小编就为大家带来一篇quartz定时执行任务,并配置web.xml的操作方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Java多线程之ThreadLocal浅析

    Java多线程之ThreadLocal浅析

    这篇文章主要分析了Java多线程ThreadLocal,ThreadLocal叫做线程变量,用于在多线程环境下创建线程本地变量。想了解更多的可以参考本文
    2023-04-04
  • 关于JDK源码中的@author unascribed注释闲谈

    关于JDK源码中的@author unascribed注释闲谈

    这篇文章主要介绍了关于JDK源码中的@author unascribed注释闲谈,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论