使用 Spring Boot Admin 監控應用狀態

来源:https://www.cnblogs.com/youyacoder/archive/2022/09/09/16672921.html
-Advertisement-
Play Games

pring Boot Actuator 是 Spring Boot 提供的對應用的自省和監控功能,如健康檢查,審計,指標收集,HTTP 跟蹤等,可以幫助開發和運維人員監控和管理 Spring Boot 應用。該模塊採集應用的內部信息,並暴露給外部的模塊,支持 HTTP 和 JMX,並可以與一些第三方... ...


程式員優雅哥 SpringBoot 2.7 實戰基礎 - 11 - 使用 Spring Boot Admin 監控應用狀態

1 Spring Boot Actuator

Spring Boot Actuator 是 Spring Boot 提供的對應用的自省和監控功能,如健康檢查,審計,指標收集,HTTP 跟蹤等,可以幫助開發和運維人員監控和管理 Spring Boot 應用。該模塊採集應用的內部信息,並暴露給外部的模塊,支持 HTTP 和 JMX,並可以與一些第三方監控系統(如 Prometheus)整合。

1.1 Actuator endpoint

端點 Endpoint 是 Actuator 的核心組成部分,用來監視應用程式的各種狀態。 Spring Boot Actuator 內置很多 Endpoint,總體上看分成三類:

  1. 應用配置類:主要包括配置信息、Spring Bean 的信息、配置文件信息、環境信息等;
  2. 度量指標類:應用在運行期間的信息,包括堆棧、健康狀態、線程池信息、HTTP請求統計等;
  3. 操作控制類:如 shutdown,提供了對應用的關閉等操作類功能。

1.2 添加依賴

在 pom.xml 中添加 Actuator 的 starter:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

1.3 訪問端點

添加依賴後,啟動服務,可通過如下請求查看暴露的端點:

http://localhost:9099/actuator

該請求返回:

{
	"_links": {
		"self": {
			"href": "http://localhost:9099/actuator",
			"templated": false
		},
		"health-path": {
			"href": "http://localhost:9099/actuator/health/{*path}",
			"templated": true
		},
		"health": {
			"href": "http://localhost:9099/actuator/health",
			"templated": false
		}
	}
}

從返回的結果可以看出預設只開放了 /actuator/health 端點。訪問該端點 http://localhost:9099/actuator/health

{"status":"UP"}

其他未開放的端點可以獨立配置開啟或禁用。

在 application.yml 中添加如下配置,開放所有的端點,並顯示詳細的 health:

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

重啟服務,再次查看暴露的端點,可以看出有如下端點:

image-20220906164739181

2 Spring Boot Admin

Spring Boot Actuator 提供了各種端點,Spring Boot Admin 能夠將 Actuator 中的信息進行界面化的展示,並提供實時報警功能。

在微服務環境中,使用 Spring Boot Admin,通常包括服務端和客戶端,服務端只運行 Spring Boot Admin Server,收集各個客戶端的數據,並以可視化界面顯示出來。客戶端運行 Spring Boot Admin Client,或者通過服務發現與註冊獲取應用的信息。

這裡的 demo 我就不在 Spring Boot Admin Server了,將當前 hero-springboot-demo 既作為 server、也作為 client 使用。在後面的實戰篇章中會獨立 Admin Server,同時客戶端也不使用 client,而是通過服務註冊與發現。

2.1 添加依賴

在 pom.xml 中添加 Spring Boot Admin Server 的依賴:

<!-- 實戰中該依賴只在獨立的 Admin Server 中使用,此處僅為測試 -->
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.7.4</version>
</dependency>
<!-- 實戰中客戶端也不需要添加該依賴,而是通過服務發現與註冊,此處僅為測試 -->
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.7.4</version>
</dependency>

需要註意版本號,由於 Spring Boot 版本使用的是 2.7.x,Spring Boot Admin Server 的版本也要用 2.7.x,千萬別亂搞!

2.2 開啟 Admin Server

在啟動類 DemoApplication 上添加註解 @EnableAdminServer 開啟 Spring Boot Admin Server。

@EnableAdminServer
@EnableAsync
@MapperScan("com.yygnb.demo.mapper")
@SpringBootApplication
public class DemoApplication {
  ...
}

2.3 配置客戶端

在 application.yml 中添加如下配置:

  1. 配置 Admin Server 的 context-path;
  2. 為客戶端配置 Admin Server 的地址。
spring:
  application:
    name: hero-springboot-demo
  boot:
    admin:
      client:
        url: 'http://localhost:9099/monitor'
      context-path: '/monitor'

2.4 訪問 Admin Server

重啟服務,在瀏覽器中訪問 Spring Boot Admin Server:

http://localhost:9099/monitor

可以看到當前應用的作為客戶端註冊到 Admin Server 上:

image-20220906171820182

再次強調,上述操作僅僅針對demo學習,非真實的企業級開發!

3 自定義告警

當應用狀態異常時,Spring Boot Admin 會自動實時告警,而告警的方式可以由我們自定義。這裡模擬日誌的方式。

在 config 包下創建類 DemoNotifier,該類繼承自 AbstractEventNotifier

@Slf4j
@Component
public class DemoNotifier extends AbstractEventNotifier {

    protected DemoNotifier(InstanceRepository repository) {
        super(repository);
    }

    @Override
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
        return Mono.fromRunnable(() -> log.error("Instance info: {}, {}, {}",
                instance.getRegistration().getName(), event.getInstance(),
                event.getType()));
    }
}

此時,註冊到這個Admin Server的其他客戶端啟動、停止等,當前應用都會監聽到事件,輸出日誌。實戰中可以在這裡面發送郵件、消息等。

4 登錄訪問

上面配置的 Admin Server 無需登錄就可以訪問,在真實開發中需要登錄後才能訪問。admin server 也提供了登錄頁面。

4.1 添加依賴

在 pom.xml 添加 Spring Security 的依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

4.2 配置用戶名密碼

在 application.yml 中配置登錄的用戶名和密碼:

spring:
  application:
    name: hero-springboot-demo
  boot:
    admin:
      client:
        url: 'http://localhost:9099/monitor'
      context-path: '/monitor'
  security:
    user:
      name: admin
      password: 111111

上面的配置在之前的基礎上增加了:spring.security.user 的配置。

4.3 添加配置類

在 config 包下添加 Spring Security 的配置類 SecurityConfig

@Configuration
public class SecurityConfig {

    private final String adminContextPath;

    public SecurityConfig(AdminServerProperties adminServerProperties) {
        this.adminContextPath = adminServerProperties.getContextPath();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler =
                new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");
        return http.authorizeHttpRequests(auth -> auth.antMatchers(
                                        adminContextPath + "/assets/**",
                                        adminContextPath + "/login",
                                        adminContextPath + "/instances",
                                        adminContextPath + "/actuator/**"
                                ).permitAll()
                                .antMatchers(adminContextPath + "/**").authenticated()
                                .anyRequest().permitAll()
                ).formLogin(form -> form.loginPage(adminContextPath + "/login")
                        .successHandler(successHandler)
                ).logout(logout -> logout.logoutUrl(adminContextPath + "/logout"))
                .csrf(AbstractHttpConfigurer::disable)
                .build();
    }
}

上面配置文件中的 adminContextPath 就是前面配置的 spring.boot.admin.context-path,即 /monitor

上面配置包括幾個部分:

  1. 僅對路徑 /monitor/** 請求許可權控制;
  2. 登錄頁面和登錄成功後的預設地址;
  3. 表單登錄配置;
  4. 禁用 CSRF。

4.4 測試運行

重啟服務,訪問之前開發的 computer 等介面,可以正常訪問;如果訪問 /monitor 等路徑,就會跳轉 Spring Boot Admin 提供的登錄頁:

image-20220906221055591

使用配置的用戶名密碼(admin/111111)登錄,登錄成功後進入 Admin Server 頁面。

感謝你閱讀本文,如果本文給了你一點點幫助或者啟發,還請三連支持一下,點贊、關註、收藏,作者會持續與大家分享更多乾貨


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個菜鳥的設計模式之旅,使用 Golang 實現。本節實現裝飾模式。小明和小王去吃沙縣小吃,各自喜歡不同的搭配,需要考慮每個人飲食喜好不同,隨時可能的變化。 ...
  • 2022-09-09 1、閉包的作用: 可以保存外部函數的變數 2、閉包的形成條件 (1)函數嵌套 (2)內部函數使用了外部函數的變數或者參數 (3)外部函數返回內部函數,這個使用了外部函數變數的內部函數稱為閉包 3、典例 1 # 函數嵌套 2 def func_out(): 3 # 外部函數 4 ...
  • 目錄 一.OpenGL 飽和度調節效果演示 1.IOS 飽和度演示效果 2.Windows OpenGL ES 飽和度演示效果 3.Windows OpenGL 飽和度演示效果 二.OpenGL 飽和度調節源碼下載 1.IOS Object-C 版本 2.Windows OpenGL ES 版本 3 ...
  • 一個菜鳥的設計模式之旅,使用 Golang 實現。本節實現解釋器模式。程式可按需載入用戶自定義的.work尾碼文件,將每行的命令解釋為具體行為。喵叫幾次、進程休眠幾秒、輸出範圍內隨機數、運行另外的work文件。 ...
  • #一、format的基本玩法 ##🚀🚀一、什麼是format format是字元串內嵌(字元串內嵌:字元串中再嵌套字元串,加入雙引號或單引號)的一個方法,用於格式化字元串。以大括弧{}來標明被替換的字元串 ##🚀🚀format玩法一:按順序輸出(按照{}的順序依次匹配括弧中的值) >>>s ...
  • IO流01 1.文件基礎知識 什麼是文件? 文件,我們並不陌生。文件是保存數據的地方。比如大家經常使用的word文檔,txt文件,excel文件等,都是文件。它既可以保存一張圖片,也可以保存聲音、視頻…… 文件流 文件在程式中是以流的形式來操作的: 流:數據在數據源(文件)和程式(記憶體)之間經歷的路 ...
  • 說明 意義 1.在Spring中,Bean的作用域可以通過scope屬性來指定。 2.指定作用域的目的是 存儲在此類單例bean的高速緩存中,並且對該命名bean的所有後續請求和引用都返回該高速緩存的對象。(本身的理念就是以空間換時間的思維,創建步驟繁雜,而且頻繁用到,我就存起來,下次用的時候就不用 ...
  • 摘要:本篇文章主要講解基於理論的圖像分割方法,通過K-Means聚類演算法實現圖像分割或顏色分層處理。 本文分享自華為雲社區《[Python圖像處理] 十九.圖像分割之基於K-Means聚類的區域分割》,作者: eastmount。 本篇文章主要講解基於理論的圖像分割方法,通過K-Means聚類演算法實 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...