欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot集成Watchdog的完整步驟教學(xué)

 更新時間:2025年09月02日 09:53:14   作者:風(fēng)象南  
這篇文章主要為大家詳細(xì)介紹了SpringBoot中集成Watchdog的完整步驟教學(xué),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

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)文章

  • java開發(fā)就業(yè)信息管理系統(tǒng)

    java開發(fā)就業(yè)信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java開發(fā)就業(yè)信息管理平臺,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 解決redisTemplate向redis中插入String類型數(shù)據(jù)時出現(xiàn)亂碼問題

    解決redisTemplate向redis中插入String類型數(shù)據(jù)時出現(xiàn)亂碼問題

    這篇文章主要介紹了解決redisTemplate向redis中插入String類型數(shù)據(jù)時出現(xiàn)亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java實戰(zhàn)之多線程模擬站點(diǎn)售票

    Java實戰(zhàn)之多線程模擬站點(diǎn)售票

    今天帶大家來練習(xí)Java實戰(zhàn),文中多線程模擬站點(diǎn)售票這個問題作了詳細(xì)的介紹,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • SpringBoot輕松實現(xiàn)ip解析(含源碼)

    SpringBoot輕松實現(xiàn)ip解析(含源碼)

    IP地址一般以數(shù)字形式表示,如192.168.0.1,IP解析是將這個數(shù)字IP轉(zhuǎn)換為包含地區(qū)、城市、運(yùn)營商等信息的字符串形式,如“廣東省深圳市 電信”,這樣更方便人理解和使用,本文給大家介紹了SpringBoot如何輕松實現(xiàn)ip解析,需要的朋友可以參考下
    2023-10-10
  • Java8接口默認(rèn)靜態(tài)方法及重復(fù)注解原理解析

    Java8接口默認(rèn)靜態(tài)方法及重復(fù)注解原理解析

    這篇文章主要介紹了Java8接口默認(rèn)靜態(tài)方法及重復(fù)注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 使用vscode搭建javaweb項目的詳細(xì)步驟

    使用vscode搭建javaweb項目的詳細(xì)步驟

    我個人是很喜歡VsCode的,開源免費(fèi)、功能全面,所以為了方便,我把我?guī)缀跛械倪\(yùn)行都集成到了VsCode上來,JavaWeb也不例外,下面這篇文章主要給大家介紹了關(guān)于使用vscode搭建javaweb項目的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • springboot項目獲取請求頭當(dāng)中的token的方法

    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的操作方法

    quartz定時執(zhí)行任務(wù),并配置web.xml的操作方法

    下面小編就為大家?guī)硪黄猶uartz定時執(zhí)行任務(wù),并配置web.xml的操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java多線程之ThreadLocal淺析

    Java多線程之ThreadLocal淺析

    這篇文章主要分析了Java多線程ThreadLocal,ThreadLocal叫做線程變量,用于在多線程環(huán)境下創(chuàng)建線程本地變量。想了解更多的可以參考本文
    2023-04-04
  • 關(guān)于JDK源碼中的@author unascribed注釋閑談

    關(guān)于JDK源碼中的@author unascribed注釋閑談

    這篇文章主要介紹了關(guān)于JDK源碼中的@author unascribed注釋閑談,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論