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