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
本文重點介紹 如何在 Linux 上安裝配置 watchdog 并與 SpringBoot 集成
2. Linux Watchdog 簡介
Linux Watchdog 本質(zhì)是一個內(nèi)核驅(qū)動,通常通過 /dev/watchdog 設(shè)備暴露給用戶空間。
它的特點:
- 需要用戶進(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 是否正在運行:
dmesg | grep watchdog # 或者: journalctl -u watchdog
4. SpringBoot 集成 Watchdog
在系統(tǒng) watchdog 運行的基礎(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ù)無法運行 → 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)程運維的場景(如邊緣計算設(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)文章
java中double強(qiáng)制轉(zhuǎn)換int引發(fā)的OOM問題記錄
這篇文章主要介紹了java中double強(qiáng)制轉(zhuǎn)換int引發(fā)的OOM問題記錄,本文給大家分享問題排查過程,感興趣的朋友跟隨小編一起看看吧2024-10-10
Java Code Cache滿導(dǎo)致應(yīng)用性能降低問題解決
這篇文章主要介紹了Java Code Cache滿導(dǎo)致應(yīng)用性能降低問題解決,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
詳解Java的Hibernate框架中的List映射表與Bag映射
這篇文章主要介紹了Java的Hibernate框架中的List映射表與Bag映射,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
java多線程抓取鈴聲多多官網(wǎng)的鈴聲數(shù)據(jù)
很容易就能發(fā)現(xiàn)通過改變 listId和page就能從服務(wù)器獲取鈴聲的json數(shù)據(jù), 通過解析json數(shù)據(jù), 可以看到都帶有{"hasmore":1,"curpage":1}這樣子的指示,通過判斷hasmore的值,決定是否進(jìn)行下一頁的抓取。 但是通過上面這個鏈接返回的json中不帶有鈴聲的下載地址2016-04-04
基于springboot創(chuàng)建mybatis的完整步驟
MyBatis是一款優(yōu)秀的數(shù)據(jù)庫持久層框架,相比Hibernate我更喜歡使用MyBatis,看的到SQL還是讓人更安心點,這篇文章主要給大家介紹了關(guān)于基于springboot創(chuàng)建mybatis的完整步驟,需要的朋友可以參考下2024-03-03
Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識入門教程
這篇文章主要介紹了Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識入門教程,包括基于TCP/IP和UDP協(xié)議的簡單實例程序講解,需要的朋友可以參考下2016-01-01
Java中@DateTimeFormat和@JsonFormat注解介紹
@DateTimeFormat和@JsonFormat都是處理時間格式化問題的,把其他類型轉(zhuǎn)換成自己需要的時間類型,下面這篇文章主要給大家介紹了關(guān)于Java中@DateTimeFormat和@JsonFormat注解介紹的相關(guān)資料,需要的朋友可以參考下2022-11-11

