SpringBoot集成Watchdog的完整步驟教學(xué)
1. 為什么需要 Watchdog
很多 Spring Boot 應(yīng)用在生產(chǎn)環(huán)境里遇到過類似問題
看似存活,實則不可用:/actuator/health 依然返回 200,但線程池/GC 已經(jīng)徹底卡死
監(jiān)控延遲發(fā)現(xiàn):Prometheus 抓到的是幾分鐘后的異常
人工干預(yù)成本高:只能 SSH 上去 kill -9 或重啟服務(wù)

解決思路
應(yīng)用層自檢:Actuator、線程池監(jiān)控、自愈腳本
系統(tǒng)級兜底:Linux Watchdog
本文重點(diǎn)介紹 如何在 Linux 上安裝配置 watchdog 并與 SpringBoot 集成
2. Linux Watchdog 簡介
Linux Watchdog 本質(zhì)是一個內(nèi)核驅(qū)動,通常通過 /dev/watchdog 設(shè)備暴露給用戶空間。
它的特點(diǎn):
- 需要用戶進(jìn)程定時“喂狗”(寫入數(shù)據(jù));
- 一旦超過設(shè)定時間沒被喂 → Watchdog 觸發(fā)動作(重啟系統(tǒng)/關(guān)閉電源/觸發(fā) NMI 等);
- 屬于 最后兜底機(jī)制,防止應(yīng)用假死。
3. 安裝與配置 Watchdog
3.1 安裝 watchdog 服務(wù)
在常見的 Linux 發(fā)行版中,watchdog 通常不是默認(rèn)安裝的,需要手動安裝:
Debian/Ubuntu:
sudo apt-get update sudo apt-get install watchdog
CentOS/RHEL/UOS:
sudo yum install watchdog
安裝完成后,會得到:
- 配置文件:
/etc/watchdog.conf - systemd 服務(wù):
watchdog.service
3.2 加載內(nèi)核驅(qū)動
常見的 Watchdog 驅(qū)動有:
- Intel 平臺:
iTCO_wdt - AMD 平臺:
sp5100_tco - 虛擬化環(huán)境(QEMU/KVM):
softdog
檢查是否支持:
ls /lib/modules/$(uname -r)/kernel/drivers/watchdog/
加載驅(qū)動,例如:
sudo modprobe iTCO_wdt # Intel 芯片 sudo modprobe softdog soft_panic=1 # 如果沒有硬件 watchdog,可用軟件模擬
加載后應(yīng)該能看到設(shè)備文件:
ls /dev/watchdog* # 輸出類似: # /dev/watchdog /dev/watchdog0
3.3 配置 watchdog 服務(wù)
編輯 /etc/watchdog.conf:
以下為幾項核心配置
watchdog-device = /dev/watchdog interval = 5 max-load-1 = 24 min-memory = 1 realtime = yes priority = 1
解釋:
watchdog-device→ 使用哪個 watchdog 設(shè)備;interval→ 心跳間隔(秒);max-load-1→ 負(fù)載過高時觸發(fā)重啟;min-memory→ 可用內(nèi)存低于閾值時觸發(fā)重啟。
3.4 啟動并驗證服務(wù)
sudo systemctl enable watchdog sudo systemctl start watchdog sudo systemctl status watchdog
驗證 watchdog 是否正在運(yùn)行:
dmesg | grep watchdog # 或者: journalctl -u watchdog
4. SpringBoot 集成 Watchdog
在系統(tǒng) watchdog 運(yùn)行的基礎(chǔ)上,我們讓 SpringBoot 主動與它交互,實現(xiàn)應(yīng)用層喂狗邏輯。
Watchdog 喂狗任務(wù)
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) {
// 先執(zhí)行 shell 命令安裝 softdog 并啟動 watchdog 服務(wù)
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("執(zhí)行命令出錯: " + cmd + ",原因:" + e.getMessage());
}
}
// 打開 /dev/watchdog 喂狗
try {
watchdog = new FileOutputStream("/dev/watchdog");
} catch (IOException e) {
System.err.println("無法打開 /dev/watchdog,請檢查驅(qū)動和權(quán)限");
return;
}
Executors.newSingleThreadScheduledExecutor()
.scheduleAtFixedRate(this::feedDog, 0, 5, TimeUnit.SECONDS);
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
if (watchdog != null) {
watchdog.close(); // 防止誤觸發(fā)
}
} catch (IOException ignored) {}
}));
}
private void feedDog() {
try {
watchdog.write("1".getBytes());
watchdog.flush();
} catch (IOException e) {
System.err.println("喂狗失?。? + e.getMessage());
}
}
}
工作機(jī)制:
- 每 5 秒喂狗一次;
- 如果 JVM 卡死(GC、死鎖、線程阻塞),喂狗失敗,系統(tǒng)觸發(fā) watchdog → 強(qiáng)制重啟;
- 在優(yōu)雅停機(jī)時關(guān)閉 watchdog,避免誤報。
5. 實戰(zhàn)場景
線程池卡死:定時任務(wù)無法運(yùn)行 → watchdog 超時 → 系統(tǒng)重啟。
Full GC 停頓:JVM 掛起 → watchdog 未被喂 → 自動恢復(fù)。
進(jìn)程死鎖:所有線程卡死 → watchdog 兜底保護(hù)。
6. 最佳實踐:應(yīng)用層 + 系統(tǒng)層雙保險
應(yīng)用層自檢
1、使用 Spring Boot Actuator 監(jiān)控線程池、GC、響應(yīng)時間
2、發(fā)現(xiàn)異常時嘗試自愈(釋放鎖、降級、重啟線程池)
系統(tǒng)層 watchdog
兜底方案,確保“再怎么掛死,系統(tǒng)都會拉起”。
這種 雙保險模式 特別適合無人值守、遠(yuǎn)程運(yùn)維的場景(如邊緣計算設(shè)備、IoT 網(wǎng)關(guān)、金融終端)。
7. 總結(jié)
1、Linux Watchdog 不是默認(rèn)可用,需要 安裝軟件包、加載驅(qū)動、配置 systemd 服務(wù);
2、Spring Boot 可以輕松集成 watchdog 喂狗機(jī)制;
3、Watchdog 結(jié)合應(yīng)用層監(jiān)控,可以構(gòu)建 自愈能力極強(qiáng)的高可用系統(tǒng);
到此這篇關(guān)于SpringBoot集成Watchdog的完整步驟教學(xué)的文章就介紹到這了,更多相關(guān)SpringBoot集成Watchdog內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決redisTemplate向redis中插入String類型數(shù)據(jù)時出現(xiàn)亂碼問題
這篇文章主要介紹了解決redisTemplate向redis中插入String類型數(shù)據(jù)時出現(xiàn)亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Java8接口默認(rèn)靜態(tài)方法及重復(fù)注解原理解析
這篇文章主要介紹了Java8接口默認(rèn)靜態(tài)方法及重復(fù)注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
springboot項目獲取請求頭當(dāng)中的token的方法
本文主要介紹了springboot項目獲取請求頭當(dāng)中的token的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
quartz定時執(zhí)行任務(wù),并配置web.xml的操作方法
下面小編就為大家?guī)硪黄猶uartz定時執(zhí)行任務(wù),并配置web.xml的操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
關(guān)于JDK源碼中的@author unascribed注釋閑談
這篇文章主要介紹了關(guān)于JDK源碼中的@author unascribed注釋閑談,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08

