Spring Boot 監(jiān)控與報警
1. 前言
因為公司開發(fā)的項目多、為客戶部署的項目實例多。工作中我們都會經(jīng)常遇到,由于某個客戶的項目突然無法訪問,一堆研發(fā)、售后部門的同事火急火燎處理問題的場景。
所以我非常希望能夠?qū)崿F(xiàn)這樣的功能:
- 能夠有一個界面,監(jiān)控所有關(guān)注的項目實例運行狀態(tài)。
- 對于某個項目實例來說,可以監(jiān)控該實例的各項運行參數(shù),例如內(nèi)存占用情況、磁盤使用情況、數(shù)據(jù)庫連接情況。
- 項目實例因各種原因關(guān)閉時,可以自動報警。
在很長一段時間內(nèi),我感覺要實現(xiàn)這些功能比較復(fù)雜。后來我稍微研究了下,在 Spring Boot 中實現(xiàn)這種監(jiān)控和報警的功能非常簡單,那還等什么呢, Let’s Go !
2. 可視化監(jiān)控
可以直接利用 Spring Boot Admin 實現(xiàn)可視化監(jiān)控,此時至少需要兩個項目實例,一個是監(jiān)控的管理端,一個是被監(jiān)控的客戶端。
2.1 構(gòu)建監(jiān)控管理端項目
打開 Spring Initializr , Spring Boot 版本選擇 2.2.5 ,Group 為 com.imooc , Artifact 為 spring-boot-monitor-manager,生成項目后導(dǎo)入 Eclipse 開發(fā)環(huán)境。
2.2 引入管理端項目依賴
監(jiān)控管理端需要使用網(wǎng)頁展示監(jiān)控信息,所以引入 Web 依賴,另外添加 Spring Boot Admin 管理端依賴項。
實例:
<!-- Web 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Admin 管理端依賴項 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.2.3</version>
</dependency>
2.3 開啟監(jiān)控管理端
在啟動類上添加 @EnableAdminServer 注解開啟 Spring Boot Admin 監(jiān)控管理功能,代碼如下:
實例:
@SpringBootApplication
@EnableAdminServer // 開啟監(jiān)控管理
public class SpringBootMonitorManagerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMonitorManagerApplication.class, args);
}
}
然后運行啟動類,訪問 http://127.0.0.1:8080
會發(fā)現(xiàn)界面上已經(jīng)顯示監(jiān)控信息了。
2.4 構(gòu)建監(jiān)控客戶端項目
打開 Spring Initializr , Spring Boot 版本選擇 2.2.5 ,Group 為 com.imooc , Artifact 為 spring-boot-monitor-client,生成項目后導(dǎo)入 Eclipse 開發(fā)環(huán)境。
2.5 引入客戶端項目依賴
直接引入 Web 依賴和監(jiān)控客戶端依賴。
實例:
<!-- Web 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Admin監(jiān)控客戶端依賴 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.2.3</version>
</dependency>
2.6 修改客戶端配置
修改客戶端的配置文件 application.properties ,以便指定客戶端指向的服務(wù)端的地址。由于剛剛服務(wù)端已經(jīng)占用了 8080 端口,所以將客戶端的端口設(shè)置為 8091 。
還有一個必要設(shè)置是客戶端的名稱,當(dāng)我們監(jiān)控的項目實例比較多時,需要通過客戶端名稱來區(qū)分。
實例:
# 配置端口
server.port=8091
# 配置監(jiān)控管理端地址
spring.boot.admin.client.url=http://127.0.0.1:8080
# 客戶端的名稱,用于區(qū)分不同的客戶端
spring.boot.admin.client.instance.name=CLIENT1
TIps:此處指定監(jiān)控管理端地址使用的是
spring.boot.admin.client.url
,我個人認為應(yīng)使用spring.boot.admin.server.url
更加合理。當(dāng)然大家不用糾結(jié)于此,此處只是特別提示。
2.7 測試監(jiān)控效果
啟動客戶端程序,然后刷新服務(wù)端網(wǎng)頁,會發(fā)現(xiàn)監(jiān)控管理頁面已經(jīng)顯示了客戶端信息。
此時我們關(guān)閉客戶端程序,然后稍等一會刷新下監(jiān)控管理頁面(注意服務(wù)端發(fā)現(xiàn)客戶端離線是需要一定時間的),會發(fā)現(xiàn)監(jiān)控管理頁已經(jīng)顯示了離線項目實例信息。
3. 監(jiān)控實例運行參數(shù)
使用 Spring Boot Admin 后,默認顯示的項目實例信息比較少。
默認設(shè)置主要是為了保證項目實例的安全性,只展示了非常少的信息,我們可以通過配置文件指定展示哪些信息,如下。
實例:
# 配置客戶端展示哪些信息,*表示展示全部信息
management.endpoints.web.exposure.include=*
此時刷新監(jiān)控管理頁,會發(fā)現(xiàn)已經(jīng)展示各類運行參數(shù)信息。
Tips:不同項目需要展示的信息不同,可以通過
management.endpoints.web.exposure.include
配置項進行設(shè)置,感興趣的同學(xué)可以自行查閱相關(guān)資料。
4. 自動報警
可視化監(jiān)控提供了全面了解項目運行狀況的手段,但是我們不可能 7*24 小時盯著界面看哪個應(yīng)用離線了。
最妙的效果是,項目離線時自動通知售后、運維等相關(guān)技術(shù)人員。
Spring Boot Admin 也提供了自動報警的功能,簡直太完美了,接下來我們來實現(xiàn)下。
4.1 引入依賴項
為監(jiān)控服務(wù)端項目引入郵件依賴。
實例:
<!-- 郵件依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
4.2 配置郵件發(fā)送所需信息
只需要配置常規(guī)的郵件收發(fā)信息即可。
實例:
# 網(wǎng)易郵箱發(fā)件服務(wù)器
spring.mail.host=smtp.163.com
# 網(wǎng)易郵箱發(fā)件端口
spring.mail.prot=25
# 發(fā)件人賬號
spring.mail.username=taqsxxkj@163.com
# 發(fā)件授權(quán)密碼,注意授權(quán)碼是用于登錄第三方郵件客戶端的專用密碼
spring.mail.password=123456
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
# Spring Boot Admin 發(fā)件收件信息
spring.boot.admin.notify.mail.from=taqsxxkj@163.com
spring.boot.admin.notify.mail.to=taqsxxkj@163.com
spring.boot.admin.notify.mail.cc=taqsxxkj@163.com
此處特別注意發(fā)件授權(quán)密碼不是普通郵箱的登錄密碼,而是授權(quán)密碼,以網(wǎng)易郵箱為例在下圖位置設(shè)置。
4.3 項目實例離線郵件報警
啟動監(jiān)控服務(wù)端和客戶端,然后關(guān)閉客戶端,稍等一會檢查指定的報警接收郵箱,就會發(fā)現(xiàn)已收到報警郵件了。
5. 視頻演示
6. 小結(jié)
報警和監(jiān)控機制可以為上線運行的項目提供額外的保障機制。
- 可視化監(jiān)控可以提供一種總攬全局的監(jiān)控視角,眾多項目運行狀況一目了然,做到心里有底。
- 對于重點項目,可以定期監(jiān)控項目實例的詳細運行參數(shù)。通過分析參數(shù)信息,預(yù)測性能瓶頸發(fā)生的時間節(jié)點,提前采取擴容等措施,防患于未然。
- 當(dāng)發(fā)生嚴重錯誤,或者由于人為誤操作導(dǎo)致項目離線時,指定郵箱能夠及時收到報警信息。技術(shù)人員及時排查處理,作為項目運維方心里更有底。