【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的監控:使用 Actuator 實現健康檢查

??<前文回顧>

點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、引子:監控這事兒,不能光靠“瞅”

咱們搞開發的,最怕的就是系統出問題,結果自己還蒙在鼓里。你說你寫的代碼,跑得好好的,突然就“拉胯”了,用戶那邊嗷嗷叫,你這邊還一臉懵。這不就跟“瞎子摸象”似的,摸到哪兒算哪兒,最后還得靠運氣。所以啊,監控這事兒,不能光靠“瞅”,得有點真家伙。

Spring Boot 里頭有個叫 Actuator 的玩意兒,專門用來監控應用的健康狀態。這玩意兒就跟“千里眼”似的,能讓你一眼瞅見系統里頭哪兒不對勁。今兒個咱就嘮嘮,咋用 Actuator 實現健康檢查。

二、Actuator 是啥?能吃嗎?

Actuator 是 Spring Boot 提供的一個模塊,專門用來監控和管理應用。它提供了一堆端點(Endpoint),通過這些端點,你可以查看應用的運行狀態、健康情況、內存使用情況等等。說白了,就是給你開了個“后門”,讓你能隨時“偷窺”系統的內部情況。

Actuator 的核心功能包括:

  • 健康檢查(Health Check)
  • 指標收集(Metrics)
  • 環境信息(Environment)
  • 線程信息(Thread Dump)
  • 日志管理(Loggers)

這些功能就跟“工具箱”似的,里頭啥都有,隨用隨取。今兒個咱主要嘮嘮健康檢查這塊兒。

三、健康檢查:別等“病入膏肓”才想起來治

健康檢查是 Actuator 里頭最常用的功能之一。它能告訴你應用現在是“生龍活虎”還是“病入膏肓”。你可能會說,這不就跟“體檢”似的嗎?沒錯,就是體檢。不過這個體檢是實時的,隨時都能做。

1. 咋啟用 Actuator?

首先,你得在?pom.xml?里頭加上 Actuator 的依賴:

XML Code

<dependency>

????<groupId>org.springframework.boot</groupId>

????<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

加完依賴,啟動應用,Actuator 就自動啟用了。默認情況下,Actuator 的端點是通過 HTTP 暴露的,你可以通過?/actuator?路徑訪問這些端點。

2. 健康檢查端點

健康檢查的端點是?/actuator/health。你可以在瀏覽器里訪問這個端點,或者用?curl?命令:

bash Code

curl http://localhost:8080/actuator/health

返回的結果大概是這樣的:

JSON Code

{

????"status": "UP"

}

這個?status?字段告訴你應用的健康狀態。UP?表示應用正常,DOWN?表示應用掛了。

3. 自定義健康檢查

默認的健康檢查只能告訴你應用是不是還活著,但有時候你需要的不僅僅是“活著”。比如,你可能想知道數據庫連接是不是正常,磁盤空間是不是夠用,外部服務是不是能訪問。這時候,你就得自定義健康檢查了。

Spring Boot 提供了一個?HealthIndicator?接口,你可以實現這個接口,自定義健康檢查的邏輯。比如,你想檢查數據庫連接是不是正常,可以這么寫:

Java Code

import org.springframework.boot.actuate.health.Health;

import org.springframework.boot.actuate.health.HealthIndicator;

import org.springframework.stereotype.Component;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

@Component

public class DatabaseHealthIndicator implements HealthIndicator {

????@Override

????public Health health() {

????????try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password")) {

????????????if (connection.isValid(1)) {

????????????????return Health.up().build();

????????????} else {

????????????????return Health.down().withDetail("Error", "Database connection is invalid").build();

????????????}

????????} catch (SQLException e) {

????????????return Health.down(e).build();

????????}

????}

}

這個?DatabaseHealthIndicator?類實現了?HealthIndicator?接口,檢查數據庫連接是不是正常。如果連接正常,返回?UP,否則返回?DOWN。

4. 健康檢查的坑

自定義健康檢查雖然好用,但也有坑。最大的坑就是健康檢查的邏輯不能太復雜,否則會影響應用的性能。比如,你要是每次健康檢查都去連接數據庫,那數據庫的壓力可就大了。所以,健康檢查的邏輯要盡量簡單,別整得太復雜。

另外,健康檢查的結果是緩存的,默認情況下,緩存時間是 10 秒。也就是說,你改了健康檢查的邏輯,得等 10 秒才能看到效果。你要是覺得 10 秒太長,可以通過配置改:

Yml Code

management:

??endpoint:

????health:

??????cache:

????????time-to-live: 1s

這個配置把緩存時間改成了 1 秒。

四、其他端點:別光盯著健康檢查

Actuator 里頭不光有健康檢查,還有其他一堆端點。這些端點就跟“工具箱”里的其他工具似的,各有各的用處。

1. 指標收集(Metrics)

指標收集的端點是?/actuator/metrics。這個端點能告訴你應用的各項指標,比如內存使用情況、CPU 使用情況、請求次數等等。你可以通過這個端點,實時監控應用的性能。

bash Code

curl http://localhost:8080/actuator/metrics

返回的結果大概是這樣的:

JSON Code

{

????"names": [

????????"jvm.memory.max",

????????"jvm.memory.used",

????????"jvm.threads.live",

????????"http.server.requests"

????]

}

你可以通過?/actuator/metrics/{metricName}?查看具體的指標。比如,查看內存使用情況:

bash Code

curl http://localhost:8080/actuator/metrics/jvm.memory.used

2. 環境信息(Environment)

環境信息的端點是?/actuator/env。這個端點能告訴你應用的環境變量、配置文件里的配置項等等。你可以通過這個端點,查看應用的配置是不是正確。

bash Code

curl http://localhost:8080/actuator/env

返回的結果大概是這樣的:

JSON Code

{

????"activeProfiles": [],

????"propertySources": [

????????{

????????????"name": "server.ports",

????????????"properties": {

????????????????"local.server.port": {

????????????????????"value": 8080

????????????????}

????????????}

????????},

????????{

????????????"name": "applicationConfig: [classpath:/application.yml]",

????????????"properties": {

????????????????"management.endpoint.health.cache.time-to-live": {

????????????????????"value": "1s"

????????????????}

????????????}

????????}

????]

}

3. 線程信息(Thread Dump)

線程信息的端點是?/actuator/threaddump。這個端點能告訴你應用的所有線程的狀態。你可以通過這個端點,查看應用是不是有線程死鎖、線程阻塞等問題。

bash Code

curl http://localhost:8080/actuator/threaddump

返回的結果大概是這樣的:

JSON Code

{

????"threads": [

????????{

????????????"threadName": "main",

????????????"threadId": 1,

????????????"blockedCount": 0,

????????????"blockedTime": -1,

????????????"waitedCount": 0,

????????????"waitedTime": -1,

????????????"lockName": null,

????????????"lockOwnerId": -1,

????????????"lockOwnerName": null,

????????????"inNative": false,

????????????"suspended": false,

????????????"threadState": "RUNNABLE",

????????????"stackTrace": [

????????????????{

????????????????????"className": "java.lang.Thread",

????????????????????"methodName": "sleep",

????????????????????"fileName": "Thread.java",

????????????????????"lineNumber": -2,

????????????????????"nativeMethod": true

????????????????}

????????????],

????????????"lockedMonitors": [],

????????????"lockedSynchronizers": [],

????????????"lockInfo": null

????????}

????]

}

4. 日志管理(Loggers)

日志管理的端點是?/actuator/loggers。這個端點能告訴你應用的日志配置。你可以通過這個端點,動態修改日志級別。

bash Code

curl http://localhost:8080/actuator/loggers

返回的結果大概是這樣的:

JSON Code

{

????"levels": [

????????"OFF",

????????"ERROR",

????????"WARN",

????????"INFO",

????????"DEBUG",

????????"TRACE"

????],

????"loggers": {

????????"ROOT": {

????????????"configuredLevel": "INFO",

????????????"effectiveLevel": "INFO"

????????},

????????"com.example": {

????????????"configuredLevel": null,

????????????"effectiveLevel": "INFO"

????????}

????}

}

你可以通過?/actuator/loggers/{loggerName}?修改某個 Logger 的日志級別。比如,把?com.example?的日志級別改成?DEBUG:

bash Code

curl -X POST http://localhost:8080/actuator/loggers/com.example -H "Content-Type: application/json" -d '{"configuredLevel": "DEBUG"}'

五、安全性:別讓人“偷家”

Actuator 的端點雖然好用,但也有安全隱患。你要是把這些端點暴露在外網,那可就相當于“開門揖盜”了。所以,你得做好安全措施。

1. 只暴露必要的端點

默認情況下,Actuator 只暴露了?/actuator/health?和?/actuator/info?兩個端點。你可以通過配置,暴露其他端點:

Yml Code

management:

??endpoints:

????web:

??????exposure:

????????include: "*"

這個配置暴露了所有端點。你要是覺得不安全,可以只暴露必要的端點:

Yml Code

management:

??endpoints:

????web:

??????exposure:

????????include: "health,info,metrics"

2. 啟用安全認證

你可以通過 Spring Security 啟用安全認證,保護 Actuator 的端點。比如,你可以配置一個簡單的 HTTP Basic 認證:

Java Code

import org.springframework.context.annotation.Bean;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;

import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import org.springframework.security.core.userdetails.User;

import org.springframework.security.core.userdetails.UserDetails;

import org.springframework.security.core.userdetails.UserDetailsService;

import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

????@Override

????protected void configure(HttpSecurity http) throws Exception {

????????http

????????????.authorizeRequests()

????????????????.antMatchers("/actuator/**").authenticated()

????????????????.and()

????????????.httpBasic();

????}

????@Bean

????@Override

????public UserDetailsService userDetailsService() {

????????UserDetails user = User.withDefaultPasswordEncoder()

????????????.username("admin")

????????????.password("password")

????????????.roles("USER")

????????????.build();

????????return new InMemoryUserDetailsManager(user);

????}

}

這個配置啟用了 HTTP Basic 認證,只有用戶名是?admin,密碼是?password?的用戶才能訪問 Actuator 的端點。

專有名詞解釋

  1. Actuator:Spring Boot 提供的一個模塊,用于監控和管理應用。
  2. HealthIndicator:Spring Boot 提供的一個接口,用于自定義健康檢查的邏輯。
  3. Metrics:Spring Boot 提供的指標收集功能,用于監控應用的性能。
  4. Environment:Spring Boot 提供的環境信息功能,用于查看應用的環境變量和配置項。
  5. Thread Dump:Spring Boot 提供的線程信息功能,用于查看應用的所有線程的狀態。
  6. Loggers:Spring Boot 提供的日志管理功能,用于查看和修改應用的日志配置。

寫在最后

身為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),已經在找朋友內測了,比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算有用,大家基本都能拿到想要的offer...

我深刻意識到,能自由做自己喜歡的事情是有多么不容易,又是多么有成就感。所以我拉了兩三個志同道合的好友,開了一間公司,繼續朝著“自由”的目標前進。

當下呢,我們希望有更多的朋友能夠參與到產品的測試中來,體驗并且給出更好的建議。未來可能會在博客po更多關于我們產品的內容,包括使用場景、說明、課程等,希望能對大家有所幫助。

另外,想整個花活兒,每天花個1-2小時,來幫助我素未謀面的老朋友們看看簡歷,提提意見啥的,純屬為愛發電。我在線時間不固定,但是不要米,咱就別要自行車兒了唄~如果您有興趣,可以點擊文章底部卡片一起交流(人工回復,比較慢,請擔待)。

最后,請大家持續關注我們的博客,未來還有很多欄目,一起發掘~!

(來呀~↓↓↓~老鐵)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900516.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900516.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900516.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

類和對象(下篇)(詳解)

【本節目標】 1. 再談構造函數 2. Static成員 3. 友元 4. 內部類 5. 再次理解封裝 1. 再談構造函數 1.1 構造函數體賦值 在創建對象時&#xff0c;編譯器通過調用構造函數&#xff0c;給對象中各個成員變量一個合適的初始值。 #include <iostream> using name…

高精度算法

高精度加法 輸入兩個數&#xff0c;輸出他們的和&#xff08;高精度&#xff09; 輸入樣例 111111111111111111111111111111 222222222222222222222222222222 輸出樣例 333333333333333333333333333333 #include <bits/stdc.h> using namespace std;string a,b; in…

Linux開發中注意哪些操作系統安全

在 Linux 開發中&#xff0c;確保操作系統的安全至關重要。以下是一些需要注意的方面&#xff1a; 用戶管理與權限控制 合理設置用戶權限&#xff1a;為不同的用戶和用戶組分配適當的權限&#xff0c;遵循最小權限原則。避免給普通用戶過多的權限&#xff0c;以免他們誤操作或…

x64dbg調試python解釋器

可以先寫個input()這會讓dbg中斷在ntdll模塊中&#xff0c;查看調用堆棧在系統調用結束后的打斷點 然后直接斷到PyObject_Vectorcall函數

? Ultralytics YOLO驗證(Val)時自動輸出COCO指標(AP):2025最新配置與代碼詳解 (小白友好 + B站視頻)

? YOLO獲取COCO指標(3)&#xff1a;驗證(Val) 啟用 COCO API 評估&#xff08;自動輸出AP指標&#xff09;| 發論文必看&#xff01; | Ultralytics | 小白友好 文章目錄 一、問題定位二、原理分析三、解決方案與實踐案例步驟 1: 觸發 COCO JSON 保存步驟 2: 確保 self.is_coc…

【嵌入式學習3】基于python的tcp客戶端、服務器

目錄 1、tcp客戶端 2、tcp服務器 3、服務器多次連接客戶端、多次接收信息 1、tcp客戶端 """ tcp:客戶端 1. 導入socket模塊 2. 創建socket套接字 3. 建立tcp連接(和服務端建立連接) 4. 開始發送數據(到服務端) 5. 關閉套接字 """ import soc…

Linux: network: 兩臺直連的主機業務不通

前提環境,有一個產品的設定是兩個主機之間必須是拿網線直連。但是設備管理者可能誤將設置配錯,不是直連。 最近遇到一個問題,說一個主機發的包,沒有到對端,一開始懷疑設定的bond設備的問題,檢查了bond的設置狀態,發現沒有問題,就感覺非常的奇怪。后來就開始懷疑兩個主機…

COMSOL固體力學接觸

目錄 一、接觸非線性及接觸面積計算 一、接觸非線性及接觸面積計算 COMSOL接觸非線性及接觸面積計算_嗶哩嗶哩_bilibili 形成聯合體&#xff0c;在定義處右鍵選擇“建立接觸對” 位移dz使用參數化掃描。 接觸選擇定義中設置的接觸對&#xff0c;選擇罰函數&#xff0c;摩擦設置…

22.OpenCV輪廓匹配原理介紹與使用

OpenCV輪廓匹配原理介紹與使用 1. 輪廓匹配的基本概念 輪廓匹配&#xff08;Contour Matching&#xff09;是計算機視覺中的一種重要方法&#xff0c;主要用于比較兩個輪廓的相似性。它廣泛應用于目標識別、形狀分析、手勢識別等領域。 在 OpenCV 中&#xff0c;輪廓匹配主要…

oracle 快速創建表結構

在 Oracle 中快速創建表結構&#xff08;僅復制表結構&#xff0c;不復制數據&#xff09;可以通過以下方法實現&#xff0c;適用于需要快速復制表定義或生成空表的場景 1. 使用 CREATE TABLE AS SELECT (CTAS) 方法 -- 復制源表的全部列和數據類型&#xff0c;但不復制數據 C…

若依原理筆記

代碼生成器 源碼分析 查詢數據庫列表 導入表結構 生成代碼 修改generator.yml配置文件 代碼生成器增強 Velocity模版引擎 基礎語法-變量 Lombok集成 E:\javaProject\dkd-parent\dkd-generator\src\main\resources\vm\java\domain.java.vm package ${packageName}.domain;#fo…

Ansible的使用

##### Ansible使用環境 - 控制節點 - 安裝Ansible軟件 - Python環境支持&#xff1a;Python>2.6 - 必要的模塊&#xff1a;如PyYAML等 - 被控節點 - 啟用SSH服務 - 允許控制節點登錄&#xff0c;通常設置免密登錄 - Python環境支持 http://www.ansible.com/ …

C++ 提高編程:模板與 STL 深度剖析

摘要&#xff1a;本文深入探討 C 提高編程中的模板編程與標準模板庫&#xff08;STL&#xff09;相關內容。詳細闡述模板編程中函數模板和類模板的概念、語法、特性及應用案例&#xff1b;對 STL 的誕生背景、基本概念、六大組件進行剖析&#xff0c;并對常用容器、函數對象、常…

C++(類模板的運用)

使用vector實現一個簡單的本地注冊登錄系統 注冊&#xff1a;將賬號密碼存入vector里面&#xff0c;注意防重復判斷 登錄&#xff1a;判斷登錄的賬號密碼是否正確 #include <iostream> #include <vector> #include <fstream> #include <sstream> usi…

【大模型】DeepSeek+藍耕MaaS平臺+海螺AI生成高質量視頻實戰詳解

目錄 一、前言 二、藍耘智能云MaaS平臺介紹 2.1 藍耘智算平臺是什么 2.2 平臺優勢 2.3 平臺核心能力 三、海螺AI視頻介紹 3.1 海螺AI視頻是什么 3.2 海螺AI視頻主要功能 3.3 海螺AI視頻應用場景 3.4 海螺AI視頻核心優勢 3.5 項目git地址 四、藍耘MaaS平臺DeepSeek海…

接口自動化學習二:session自動管理cookie

session自動管理cookie&#xff1a; cookie中的數據&#xff0c;都是session提供的 實現步驟&#xff1a; 1.創建session對象&#xff1b;my_sessionrequests.Session() 2.使用session實例&#xff0c;調用get方法&#xff0c;發送獲取驗證碼請求&#xff08;不需要提取cookie&…

C++類型轉換詳解

目錄 一、內置 轉 內置 二、內置 轉 自定義 三、自定義 轉 內置 四、自定義 轉 自定義 五、類型轉換規范化 1.static_case 2.reinterpret_cast 3.const_cast 4.dynamic_cast 六、RTTI 一、內置 轉 內置 C兼容C語言&#xff0c;在內置類型之間轉換規則和C語言一樣的&am…

QEMU源碼全解析 —— 塊設備虛擬化(17)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(16) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 《KVM實戰 —— 原理、進階與性能調優》—— 任永杰 程舟,機械工業出版社

mac 卸載流氓軟件安全助手

之前個人電腦在公司使用過一段時間&#xff0c;為了使用網線聯網安裝了公司指定的 聯軟上網助手&#xff0c;誰知安裝容易卸載難&#xff0c;后來找運維來卸載&#xff0c;輸入管理員密碼后&#xff0c;也無反應&#xff0c;最后不了了之了&#xff0c;這個毒瘤軟件長期在后臺駐…

Java 大視界 -- Java 大數據機器學習模型在智能客服多輪對話系統中的優化策略(179)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…