最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

本文重點介紹 如何在 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自定義注解實現(xiàn)Redis自動緩存的方法

    Java自定義注解實現(xiàn)Redis自動緩存的方法

    本篇文章主要介紹了Java自定義注解實現(xiàn)Redis自動緩存的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • java中double強(qiáng)制轉(zhuǎn)換int引發(fā)的OOM問題記錄

    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)用性能降低問題解決

    這篇文章主要介紹了Java Code Cache滿導(dǎo)致應(yīng)用性能降低問題解決,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解Java的Hibernate框架中的List映射表與Bag映射

    詳解Java的Hibernate框架中的List映射表與Bag映射

    這篇文章主要介紹了Java的Hibernate框架中的List映射表與Bag映射,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • java 偽造http請求ip地址的方法

    java 偽造http請求ip地址的方法

    這篇文章主要介紹了java 偽造http請求ip地址的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Java基于BIO實現(xiàn)文件上傳功能

    Java基于BIO實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了Java基于BIO實現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java多線程抓取鈴聲多多官網(wǎng)的鈴聲數(shù)據(jù)

    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的完整步驟

    基于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ǔ)知識入門教程

    這篇文章主要介紹了Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識入門教程,包括基于TCP/IP和UDP協(xié)議的簡單實例程序講解,需要的朋友可以參考下
    2016-01-01
  • Java中@DateTimeFormat和@JsonFormat注解介紹

    Java中@DateTimeFormat和@JsonFormat注解介紹

    @DateTimeFormat和@JsonFormat都是處理時間格式化問題的,把其他類型轉(zhuǎn)換成自己需要的時間類型,下面這篇文章主要給大家介紹了關(guān)于Java中@DateTimeFormat和@JsonFormat注解介紹的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評論

云和县| 黔东| 嘉鱼县| 奉化市| 锡林郭勒盟| 科技| 平凉市| 兴隆县| 婺源县| 天门市| 南丰县| 惠来县| 新晃| 芜湖市| 五大连池市| 昆明市| 南汇区| 辽阳市| 清丰县| 保德县| 准格尔旗| 怀化市| 固镇县| 徐州市| 太原市| 鲁甸县| 垫江县| 忻州市| 西城区| 岐山县| 东乡县| 德江县| 阳朔县| 和林格尔县| 金塔县| 五华县| 栖霞市| 井冈山市| 昭觉县| 黑河市| 鄂州市|