javascript
SpringBoot - 构建监控体系03_使用 Admin Server 管理 Spring 应用程序
文章目錄
- Pre
- 引入 Spring Boot Admin 組件
- 基于獨立服務構建 Admin Server
- 基于注冊中心構建 Admin Server
- 使用 Admin Server 監(jiān)控系統(tǒng)
- 監(jiān)控系統(tǒng)運行時關鍵指標
- 控制訪問安全性
Pre
通過引入 Actuator 組件,我們?yōu)?Spring Boot 應用程序添加了系統(tǒng)監(jiān)控功能。基于 Actuator 暴露的各種 HTTP 端點,開發(fā)人員可以獲取系統(tǒng)的運行時狀態(tài)。而端點是一種底層的監(jiān)控技術,這就要求我們對 HTTP 協(xié)議和 Spring Boot 應用程序的構建方式有一定的了解。
那么,有沒有更簡單的、基于可視化的方式獲取這些端點背后的信息呢? 我們將要介紹 Spring Boot Admin 組件。
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent>引入 Spring Boot Admin 組件
Spring Boot Admin 是一個用于監(jiān)控 Spring Boot 的應用程序,它的基本原理是通過統(tǒng)計、集成 Spring Boot Actuator 中提供的各種 HTTP 端點,從而提供簡潔的可視化 WEB UI,如下圖所示
從上圖中,我們不難看出,Spring Boot Admin 的整體架構中存在兩大角色,即服務器端組件 Admin Server 和客戶端組件 Admin Client。其中,Admin Client 實際上是一個普通的 Spring Boot 應用程序,而 Admin Server 則是一個獨立服務,需要進行專門構建。
接下來,我們先介紹構建 Admin Server 的兩種實現(xiàn)方式:
- 一種是簡單的基于獨立的 Admin 服務;
- 另一種則相對復雜,需要依賴服務注冊中心的服務注冊和發(fā)現(xiàn)機制。
基于獨立服務構建 Admin Server
無論使用哪種方式實現(xiàn) Admin Server,首先我們都需要創(chuàng)建一個 Spring Boot 應用程序,并在 pom 文件中添加如下所示的依賴項:
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-server</artifactId><version>2.2.3</version></dependency><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-server-ui</artifactId><version>2.2.3</version></dependency>請注意: Spring Boot Admin 組件并不是 Spring 家族官方提供的組件,而是來自一個 codecentric AG 團隊。
如果我們想將普通的 Spring Boot 應用程序轉變?yōu)?Spring Boot Admin Server,只需要在 Bootstrap 類上添加一個 @EnableAdminServer 注解即可,添加完該注解的 BootStrap 類如下代碼所示:
@SpringBootApplication @EnableAdminServer public class AdminApplication {public static void main(String[] args) {SpringApplication.run(AdminApplication.class, args);} }從圖中我們可以看到,目前還沒有一個應用程序與 Admin Server 有關聯(lián)。如果想將應用程序與 Admin Server 進行關聯(lián),我們還需要對原有的 Spring Boot 應用程序做一定的改造。
首先,我們在 Maven 依賴中引入對 Spring Boot Admin Client 組件的依賴,如下代碼所示:
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId> </dependency>然后,我們在配置文件中添加如下配置信息,以便該應用程序能夠與 Admin Server 進行關聯(lián)。
spring:boot:admin:client:url: http://localhost:9000注意:這里的 9000 就是 Admin Server 的服務器端口。
現(xiàn)在我們啟動這個應用程序,就會發(fā)現(xiàn) Admin Server 中已經(jīng)出現(xiàn)了這個應用的名稱和地址了
基于注冊中心構建 Admin Server
雖然基于獨立服務構建 Admin Server 和 Admin Client 非常簡單,但是需要我們在每個應用程序中添加對 Spring Boot Admin 的 Maven 依賴,并指定 Admin Server 地址。這實際上是一種代碼侵入,意味著應用程序與 Admin Server 之間有一種強耦合。
那么,有沒有更好的辦法分離或轉嫁這種耦合呢?
聯(lián)想到 Admin Server 和 Admin Client 之間需要建立類似服務注冊的關聯(lián)關系,我們可以認為這是服務注冊和發(fā)現(xiàn)機制的一種表現(xiàn)形式。
在 Spring 家族中,存在一個用于構建微服務架構的 Spring Cloud 框架,而該框架中恰好存在一款專門實現(xiàn)服務注冊和發(fā)現(xiàn)的組件——服務注冊中心 Spring Cloud Netflix Eureka ,且 Spring Boot Admin 內(nèi)置了與這款注冊中心實現(xiàn)工具的無縫集成。
基于注冊中心,Admin Server 與各個 Admin Client 之間的交互方式如下圖所示:
使用 Eureka 構建注冊中心的過程也很簡單,首先我們創(chuàng)建一個獨立的 Spring Boot 應用程序,并在 pom 文件中添加如下所示的用于提供 Eureka 服務端功能的 Maven 依賴:
引入 Maven 依賴后,我們就可以創(chuàng)建 Spring Boot 的啟動類。在示例代碼中,我們把該啟動類命名為 EurekaServerApplication,如下代碼所示:
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);} }注意:在上面的代碼中,我們在啟動類上加了一個@EnableEurekaServer 注解。在 SpringCloud 中,包含 @EnableEurekaServer 注解的服務也就是一個 Eureka 服務器組件。這樣,Eureka 服務就構建完畢了。
同樣,Eureka 服務還為我們提供了一個可視化的 UI 界面,它可以用來觀察當前注冊到 Eureka 中的應用程序信息,如下圖所示:
接下來,我們需要 Admin Server 也做相應調(diào)整。首先,我們在 pom 文件中添加一個對 spring-cloud-starter-netflix-eureka-client 這個 Eureka 客戶端組件的依賴:
這時 Admin Server 相當于 Eureka 的客戶端,因此,我們需要在它的 BootStrap 類上添加 @EnableEurekaClient 注解,以便將 Admin Server 注冊到 Eureka 上。
重構 Admin Server 的最后一步是調(diào)整配置信息,此時我們需要在配置文件中添加如下所示的配置項來指定 Eureka 服務器地址。
eureka:client:registerWithEureka: truefetchRegistry: trueserviceUrl:defaultZone: http://localhost:8761/eureka/好了,現(xiàn)在 Admin Server 已經(jīng)重構完畢,接下來我們一起看看 Admin Client。
引入注冊中心的目的是降低 Admin Client 與 Admin Server 之間的耦合度,關于這點我們從 Maven 依賴上就可以得到印證。有了注冊中心后,Admin Client 就不再依賴 spring-boot-admin-starter-client 組件了,而是直接使用如下所示的 Eureka 客戶端組件。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>在配置文件中,我們需要去掉對 Admin Server 地址的引用,直接使用 Eureka 服務端地址即可,且無須對 Admin Client 中的 Bootstrap 類做任何修改。
通過以上調(diào)整,各個 Admin Client 就能通過 Eureka 注冊中心完成與 Admin Server 的關聯(lián)了。
使用 Admin Server 監(jiān)控系統(tǒng)
根據(jù) Spring Boot Admin 官方 Github 上的介紹,Admin Server 監(jiān)控系統(tǒng)提供了一套完整的可視化方案。基于 Admin Server,健康狀態(tài)、JVM、內(nèi)存、Micrometer 的度量、線程、HTTP 跟蹤等核心功能都可以通過可視化的 UI 界面進行展示。
監(jiān)控系統(tǒng)運行時關鍵指標
注意到 Admin Server 菜單中有一個“Wallboard”,點擊該菜單,我們就可以看到一面應用墻,如下圖所示:
點擊應用墻中的某個應用,我們就能進入針對該應用的監(jiān)控信息主界面。在該界面的左側,包含了監(jiān)控功能的各級目錄,如下圖所示:
咩有的話,看看你是否
management:endpoints:web:exposure:include: "*"在圖中,我們看到了最重要的“Health”信息,顯然,這一信息來自 Spring Boot Actuator 組件的 Health 端點,
在這個界面上繼續(xù)往下滑動,我們將看到一些與 JVM 相關的監(jiān)控信息,比如非常有用的線程、垃圾回收、內(nèi)存狀態(tài)等數(shù)據(jù),如下圖所示:
這些 JVM 數(shù)據(jù)都是通過可視化的方式進行展現(xiàn),并隨著運行時狀態(tài)的變化而實時更新。
Spring Boot Actuator 中的度量指標 ,而在 Admin Server 中,同樣存在一個“Metrics”菜單,展示效果如下圖所示:
在“Metrics”菜單中,開發(fā)人員可以通過對各種條件進行篩選,然后添加對應的度量指標。比如上圖中,我們針對 HTTP 請求中 /actuator/health 端點進行了過濾,從而得到了度量結果。
接著我們一起看看系統(tǒng)環(huán)境方面的屬性,因為這方面的屬性非常之多,所以 Admin Server 也提供了一個過濾器,如下圖所示:
在上圖中,通過輸入“spring.”參數(shù),我們就能獲取一系列與該參數(shù)相關的環(huán)境屬性。
日志也是我們監(jiān)控系統(tǒng)的一個重要途徑,在 Admin Server 的“Loggers”菜單中,可以看到該應用程序的所有日志信息,如下圖所示:
通過”springcss”關鍵詞對這些日志進行過濾,我們就可以獲取 SpringCSS中的日志詳細了,圖中也顯示了每個日志記錄器對應的日志級別。
最后,我們來看一下 Admin Server 中的“JVM”菜單,該菜單下存在兩個子菜單:“Thread Dump”和“Heap Dump”。
以“Thread Dump”為例,盡管 Actuator 提供了 /threaddump 端點,但開發(fā)人員只能獲取觸發(fā)該端點時的 Dump 信息,而 Admin Server 則提供了一個連續(xù)性的可視化監(jiān)控界面,如下圖所示:
點擊圖中的色條,我們就可以獲取每一個線程的詳細信息了,這里你可以嘗試做一些分析。
控制訪問安全性
講到這里,我們會發(fā)現(xiàn) Admin Server 的功能非常強大,而這些功能顯然也不應該暴露給所有的開發(fā)人員。因此,我們需要控制 Admin Server 的訪問安全性。
想做到這一點也非常簡單,我們只需要集成 Spring Security 即可。我們在 Spring Boot 應用程序中添加一個對 spring-boot-starter-security 的 Maven 依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>然后,我們在配置文件中添加如下配置項:
spring:security:user:name: "artisan"password: "artisan123"重啟 Admin Server 后,再次訪問 Web 界面時,就需要我們輸入用戶名和密碼了,如下圖所示:
總結
以上是生活随笔為你收集整理的SpringBoot - 构建监控体系03_使用 Admin Server 管理 Spring 应用程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot - 构建监控体系0
- 下一篇: 设计模式 - 基本功的重要性